1.BufferedReader類
BufferedReader類屬於一個緩衝的輸入流,而且是一個字符流的操作對象。在java中對於緩衝流也分爲兩類:字節緩衝流(BufferedInputStream)、字符緩衝流(BufferedReader)。
之所以選擇BufferedReader類操作是因爲在此類中提供有如下方法(讀取一行數據):
String readLine() throws IOException
這個方法可以直接讀取一行數據(以回車爲換行符)
但是這個時候有一個非常重要的問題要解決,來看BufferedReader類的定義與構造方法:
public class BufferedReader extends Reader
public BufferedReader(Reader in)
而System.in是InputStream類的子類,這個時候與Reader沒有關係,要建立起聯繫就要用到InputStreamReader類。如下:
範例:利用BufferedReader實現鍵盤輸入
以上操作形式是java10多年前輸入的標準格式,但是時過境遷,這個類也淹沒在歷史的潮流之中,被JDK1.5提供的java.util.Scanner類所取代。
使用以上形式實現的鍵盤輸入還有一個最大特點,由於接收的數據類型爲String,可以使用String類的各種操作進行數據處理並且可以變爲各種常見數據類型。
2.java.util.Scanner類
打印流解決的是OutputStream類的缺陷,BufferedReader解決的是InputStream類的缺陷。而Scanner解決的是BufferedReader類的缺陷(替換BufferedReader類)
Scanner是一個專門進行輸入流處理的程序類,利用這個類可以方便處理各種數據類型,同時也可以直接結合正則表達式進行各項處理,在這個類中主要關注以下方法:
- 判斷是否有指定類型數據: public boolean hasNextXxx()
- 取得指定類型的數據: public 數據類型 nextXxx()
- 定義分隔符:public Scanner useDelimiter(Pattern pattern)
- 構造方法:public Scanner(InputStream source)
範例:使用Scanner實現數據輸入
使用Scanner還可以接收各種數據類型,並且幫助用戶減少轉型處理。
範例:接收其他類型數據
最爲重要的是,Scanner可以對接收的數據類型使用正則表達式判斷
範例:利用正則表達式進行判斷
但是以上操作在開發之中基本不會出現,現在不可能讓你編寫一個命令行程序進行數據輸入。
使用Scanner本身能夠接收的是一個InputStream對象,那麼也就意味着可以接收任意輸入流,例如:文件輸入流 ;Scanner完美的替代了BufferedReader,而且更好的實現了InputStream的操作。
範例:使用Scanner操作文件
總結:以後除了二進制文件拷貝的處理之外,那麼只要是針對程序的信息輸出都是用打印流(PrintStream、PrintWriter),信息輸出使用Scanner。