From Gossip@caterpillar

Java Gossip: 使用 BufferedReader 取得輸入

使用Scanner來取得使用者的輸入很方便,但是它以空白來區隔每一個輸入字串,在某些時候並不適用,因為使用者可能輸入一個字串,中間會包括空白字 元,而您希望取得完整的字串。

您可以使用BufferedReader類 別,它是java.io套件 中所提供的一個類別,所以使用這個類別時必須先import java.io套件;使用BufferedReader物件的readLine()方法必須處理IOException例外 (exception),例外處理機制是Java提 供給程式設計人員捕捉程式中可能發生的錯誤所提供的機制,現階段您處理IOException的方法是在main()方法後,加上 throws IOException,這在以後會再詳細討論為何要這麼作。

BufferedReader在建構時接受一個Reader物 件,在 讀取標準輸入串流時,會使用InputStreamReader, 它 繼承了 Reader類別,您使用以下的方法來為標準輸入串流建立緩衝區物件:
BufferedReader buf = new BufferedReader(
                           new InputStreamReader(System.in));

"new"關鍵字表示您要建構一個物件為您所用,BufferedReader buf表示宣告一個型態為BufferedReader的物件變數,而new BufferedReader()表示以BufferedReader類別建構一個物件,new InputStreamReader(System.in)表示接受一個System.in物件來建構一個InputStreamReader物件。

您可以在學過物件導向觀念之後再來看這段,現階段若您比較難理解,就記得上面的緩衝區讀取物件建立方式,通常要使用BufferedReader來取得使 用者的輸入都是這麼寫的。

下面這個程式可以在文字模式下取得使用者輸入(可包括空白字元輸入),並重新顯示在主控台中:

  • GetInput.java
import java.io.*; 

public class GetInput {
public static void main(String[] args) throws IOException {
BufferedReader buf = new BufferedReader(
new InputStreamReader(System.in));

System.out.print("請輸入一列文字: ");
String text = buf.readLine();
System.out.println("您輸入的文字: " + text);
}
}

readLine()方法會傳回使用者在按下Enter鍵之前的所有字元輸 入,不包括最後按下的 Enter返回字元,程式的執行範例如下所示:
請輸入一列文字: This is a test!
您輸入的文字: This is a test!