InputStreamReader和OutputStreamWriter類就是至關於輸入和輸出流之上的裝飾器,把面向字節的接口改成面向字符的接口。完成以後,就能夠在它們之上使用面向字符的過濾器閱讀器或過濾器書寫器。與過濾器流同樣,有不少子類能夠完成特定的過濾工做,包括:java
BufferedReader編程
BufferedWriterwindows
LineNumberReader數組
PushbackReader網絡
PrintWriterapp
BufferedReader和BufferedWriter類是基於字符的,對應於面向字節的BufferedInputStream和BufferedOutputStream類。BufferedInputStream和BufferedOutputStream中使用一個內部字節數組做爲緩衝區,相應地,BufferedReader和BufferedWriter使用一個內部字符數組做爲緩衝區。函數
當程序從BufferedReader讀取時,文本會從緩衝區獲得,而不是直接從底層輸入流或其餘文本源讀取。當緩衝區請空時,將用盡量多的文本再次填充,儘管這些文本不是所有都當即須要,這樣可使之後的讀取速度更快。當程序寫入一個BufferedWriter時,文本被放置在緩衝區中。只有當緩衝區填滿或者當書寫器顯式刷新輸出時,文本纔會被移到底層輸出流或其餘目標,這使得寫入也要快得多。編碼
BufferedReader和BufferedWriter也有與閱讀器和書寫器關聯的經常使用方法,如:read(),ready(),writer()和close()。這兩個類都有兩個構造函數,能夠將BufferedReader或BufferedWriter串鏈到一個底層閱讀器或書寫器,並設置緩衝區的大小,若是沒有設置大小,則使用默認的大小8192字符:spa
public BufferedReader(Reader in,int bufferSize) public BufferedReader(Reader in) public BufferedWriter(Writer out) public BufferedWriter(Writer out,int bufferSize)
咱們使用BufferedReader來對上一節的示例重構一下:code
package io; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class InputStreamReaderTest { public static void main(String[] args) { //注意這裏 try(BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(new File("/home/fuhd/text")),"UTF8"),1024)){ int c; StringBuffer sb = new StringBuffer(); while((c = reader.read()) != -1){ sb.append((char)c); } System.out.println(sb.toString()); }catch(IOException e){ e.printStackTrace(); } } }
BufferedReader類還有一個readLine()方法,它讀取一行文本,並做爲一個字符串返回:
public String readLine() throws IOException
這個方法能夠替代DataInputStream中已經廢棄的readLine()方法,它與該方法的行爲基本相同。主要的區別在於,經過將BufferedReader串鏈到InputStreamReader,你能夠採用正確的字符集讀取行,而不是採用平臺的默認編碼方式。如例:
package io; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; public class InputStreamReaderTest { public static void main(String[] args) { try(BufferedReader reader = new BufferedReader(new InputStreamReader( new FileInputStream(new File("/home/fuhd/text")),"UTF8"),1024)){ System.out.println(reader.readLine()); //這裏直接讀一行 }catch(IOException e){ e.printStackTrace(); } } }
這個BufferedWriter類增長了一個其超類所沒有的新方法,名爲newLine(),也用於寫入一行:
public void newLine() throws IOException
這個方法向輸出插入一個與平臺有關的行分隔符字符串。line.separator系統屬性會肯定這個字符串是什麼:在Unix和Mac OS X下多是換行,在Mac OS 9下是回車,在windows下是回車/換行對。因爲網絡協議通常會指定所需的行結束符,因此網絡編程中不要使用這個方法,而應當顯式地寫入協議所需的行結束符。大多數狀況下,所需的結束符都是回車/換行對。