緩衝輸入流
- 字符緩衝區流:BufferedReader、BufferedWriter;
- 字節緩衝區流:BufferedInputStream、BufferedOutputStream;
重點講解BufferedReader
java.lang.Object
繼承者 java.io.Reader
繼承者 java.io.BufferedReader
public class BufferedReader extends Reader
從字符輸入流中讀取文本,緩衝各個字符,從而實現字符、數組和行的高效讀取。
構造方法摘要
BufferedReader(Reader in)
創建一個使用默認大小輸入緩衝區的緩衝字符輸入流。
BufferedReader(Reader in, int sz)
創建一個使用指定大小輸入緩衝區的緩衝字符輸入流。
參數信息:
in - 一個 Reader
sz - 輸入緩衝區的大小
public class InputStreamReader extends Reader
InputStreamReader 是字節流通向字符流的橋樑:它使用指定的 charset 讀取字節並將其解碼爲字符。它使用的字符集可以由名稱指定或顯式給定,或者可以接受平臺默認的字符集。
每次調用 InputStreamReader 中的一個 read() 方法都會導致從底層輸入流讀取一個或多個字節。要啓用從字節到字符的有效轉換,可以提前從底層流讀取更多的字節,使其超過滿足當前讀取操作所需的字節。
爲了達到最高效率,可要考慮在 BufferedReader 內包裝 InputStreamReader。例如:
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
鍵盤數據輸入的標準格式:
package com.jluzh.system;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BufferedReadTest {
public static void main(String[] args) throws Exception {
//java.io.BufferedReader.BufferedReader(Reader in)
//java.io.InputStreamReader.InputStreamReader(InputStream in)將字節流轉爲字符流
//InputStream java.lang.System.in
//BufferedReader的構造方法接收的是Reader對象,而InputStreamReader接收的是InputStream對象
//而System .in正好是InputStream對象,且InputStreamReader可以向上轉型爲Reader對象
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("請輸入數據:");
String str = buf.readLine();//以回車作爲換行
System.out.println("輸入的內容爲:"+str);
}
}
主要用於解決System.in 中文亂碼的問題
使用BufferedRead的主要原因:其可以實現字符串數據的接收,所以現在可以基於正則進行判斷
判斷輸入內容
package com.jluzh.system;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class BufferedReadTest2 {
public static void main(String[] args) throws Exception {
//java.io.BufferedReader.BufferedReader(Reader in)
//java.io.InputStreamReader.InputStreamReader(InputStream in)
//InputStream java.lang.System .in
//BufferedReader的構造方法接收的是Reader對象,而InputStreamReader接收的是InputStream對象
//而System .in正好是InputStream對象,且InputStreamReader可以向上轉型爲Reader對象
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
boolean flag = true;//用於循環邏輯
while(flag){
System.out.println("請輸入年齡:");
String str = buf.readLine();//以回車作爲換行
if(str.matches("\\d{1,3}")){
//輸入數據由數字組成
System.out.println("年齡是:"+Integer.parseInt(str));
flag = false;//退出循環
}else{
System.out.println("年齡輸入錯誤,應該由數字組成或在三位數。");
}
}
}
}
除了可以接收輸入信息之外,也可以利用緩衝區讀取進行文件的讀取
與直接使用InputStream(Reader)類相比,使用BufferedReader在進行文件信息讀取的時候回更加的方便.
例子:
package com.jluzh.system;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
public class BufferedReaderTest3 {
public static void main(String[] args) throws Exception {
File file = new File("E:"+File.separator+"IOtest"+File.separator+"BufferesReaderTest3.txt");
if(!file.exists()){
//如果讀取的源文件不存在
System.out.println("讀取的源文件不存在!");
System.exit(1);//程序退出執行
}
BufferedReader buf = new BufferedReader(new FileReader(file));
String str = null;
while((str = buf.readLine())!=null){
System.out.println(str);
}
buf.close();
}
}