— 本文參照 Learn Java for Android Development (第三版)
前面的介紹的HelloWorld和DumpArgs類主要是告訴我們怎么用我們的程序去輸出一些內(nèi)容,我們可以直接打印在屏幕上,也可以把輸出內(nèi)容保存到一個文件里面。接下來會用一些新的例子告訴大家怎么往我們的程序輸入一些東西。
public class EchoText
{
public static void main(String[] args)
{
boolean isRedirect = false;
if (args.length != 0) isRedirect = true;
int ch;
try{
while ((ch = System.in.read()) != ((isRedirect) ? -1 : '\n'))
System.out.print((char) ch);
}catch (java.io.IOException ioe){
System.err.println("I/O error");
}
System.out.println();
}
}
這個EchoText比之前介紹的HelloWorld類要復(fù)雜一些了。不過沒關(guān)系,我們一句一句來看。首先這個類是定義個一個布爾變量isRedirect,并且初始化為false。用這個布爾變量來標識本程序是從鍵盤讀取輸入還是從文件直接讀取輸入。默認值false表示默認是從鍵盤讀入。
在這個程序里面我們使用的是判斷有無命令行參數(shù)來決定程序是接受的鍵盤輸入還是直接通過讀取文件獲取數(shù)據(jù)。如果命令行參數(shù)的值不為0,則賦值isRedirect為true,表示讀取文件,否則就賦值isRedirect為false表示接受的是鍵盤輸入(鍵盤輸入的話結(jié)束符是enter鍵)。
接著往后面看定義了一個整形變量int,用來保存我們的輸入內(nèi)容。再后面的一段代碼被一個try.....catch語句包圍起來了。一般用這兩個關(guān)鍵字包起來的代碼是在運行的時候極有可能會拋出異常,catch就是用來捕獲這些拋出的異常的。具體的用法后面肯定是會介紹的。
try語句的主體是一個用來讀取輸入數(shù)據(jù)的while循環(huán)。首先調(diào)用系統(tǒng)的System類讀入數(shù)據(jù)并將數(shù)據(jù)保存在ch變量中。直到輸入的值ch為-1(isRedirect為true的時候)或者‘\n’(isRedirect為false的時候)的時候結(jié)束while循環(huán)。
如果輸入的ch不是-1或者‘\n’的話就先把它轉(zhuǎn)化為char類型然后輸出。(char)表示的就是把后面的數(shù)據(jù)強制轉(zhuǎn)化為char類型。這里我們還是用System.out.print()來輸出數(shù)據(jù),注意這里是不換行的,要跟println()區(qū)分。
如果我們執(zhí)行程序的時候帶了命令行參數(shù),那么程序就是從文件里面直接讀取數(shù)據(jù)。現(xiàn)在假設(shè)我們的文件是存儲在移動設(shè)備里面的,恰好執(zhí)行程序的時候設(shè)備被移除了,這時候程序就沒辦法讀取到設(shè)備里面的文件,即文件讀取失敗,這時候我們的System.in.read()就會拋出一個i/o異常用來描述這個錯誤。catch就會捕獲到這個異常,catch里面的語句就會執(zhí)行,通過標準錯誤流System.err.println("I/O error");.打印"I/O error"。其實System.error跟System.out的用法是差不多的,只是一個用來打印正常的程序數(shù)據(jù),另一個是用來打印程序出錯時系統(tǒng)反饋給我們的數(shù)據(jù)。
執(zhí)行這個程序的話有兩種方法:
1 從鍵盤輸入:
javac EchoText.java
java EchoText
This is a test. //看到屏幕上的光標以后,用鍵盤向程序輸入這些數(shù)據(jù)后按enter鍵就會看到這些數(shù)據(jù)被打印在了屏幕上。
2 從文件讀取數(shù)據(jù)
java EchoText
請注意這時候程序只有一個命令行參數(shù):x,并不是兩個。跟在文件名后面的才算是參數(shù),文件名不會被判定為參數(shù)的。這時候我們會看到EchoText.java文件就打印到了屏幕上。
假如我們按這種方式執(zhí)行看看:java EchoText
這種情況下其實是沒有命令行參數(shù)的,我們的程序接受的輸入來自鍵盤,而實際的鍵盤輸入來自EchoText.java,又因為代碼的每一行都有一個行結(jié)束符'\n',所以代碼會只打印代碼的第一行。
特殊情況:如果我們把while循環(huán)改成這個樣子:while ((ch = System.in.read()) != -1),并且使用鍵盤輸入,那么我們的循環(huán)就永遠停不下來,因為輸入永遠也不等于-1,這個時候我們只能通過Ctrl+C來結(jié)束我們的程序了(這是在windows平臺上,如果是其他平臺的話就要找到與這個等效的按鍵)。
這篇好長好長啊。。。。。
Page 14