流之閱讀器和書寫器(過濾器閱讀器和過濾器書寫器)

InputStreamReaderOutputStreamWriter類就是至關於輸入和輸出流之上的裝飾器,把面向字節的接口改成面向字符的接口。完成以後,就能夠在它們之上使用面向字符的過濾器閱讀器過濾器書寫器。與過濾器流同樣,有不少子類能夠完成特定的過濾工做,包括:java

  • BufferedReader編程

  • BufferedWriterwindows

  • LineNumberReader數組

  • PushbackReader網絡

  • PrintWriterapp

BufferedReaderBufferedWriter類是基於字符的,對應於面向字節的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下是回車/換行對。因爲網絡協議通常會指定所需的行結束符,因此網絡編程中不要使用這個方法,而應當顯式地寫入協議所需的行結束符。大多數狀況下,所需的結束符都是回車/換行對。

相關文章
相關標籤/搜索