Java™ 教程(字符流)

字符流

Java平臺使用Unicode約定存儲字符值,字符流I/O自動將此內部格式與本地字符集進行轉換,在Western語言環境中,本地字符集一般是ASCII的8位超集。html

對於大多數應用程序,具備字符流的I/O並不比具備字節流的I/O複雜,使用流類完成的輸入和輸出會自動轉換爲本地字符集和從本地字符集轉換,使用字符流代替字節流的程序會自動適應本地字符集併爲國際化作了準備 — 全部這些都無需程序員的額外努力。java

若是國際化不是優先事項,你能夠簡單地使用字符流類,而沒必要過多關注字符集問題,以後,若是國際化成爲優先事項,你的程序能夠進行調整而無需進行大量從新編碼。git

使用字符流

全部字符流類都派生自ReaderWriter,與字節流同樣,有專門用於文件I/O的字符流類:FileReaderFileWriterCopyCharacters示例說明了這些類。程序員

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class CopyCharacters {
    public static void main(String[] args) throws IOException {

        FileReader inputStream = null;
        FileWriter outputStream = null;

        try {
            inputStream = new FileReader("xanadu.txt");
            outputStream = new FileWriter("characteroutput.txt");

            int c;
            while ((c = inputStream.read()) != -1) {
                outputStream.write(c);
            }
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }
}

CopyCharactersCopyBytes很是類似,最重要的區別是CopyCharacters使用FileReaderFileWriter代替FileInputStreamFileOutputStream進行輸入和輸出。請注意,CopyBytesCopyCharacters都使用int變量來讀取和寫入,可是,在CopyCharacters中,int變量在其最後16位中保存一個字符值,在CopyBytes中,int變量在其最後8位中保存一個字節值。github

使用字節流的字符流

字符流一般是字節流的「包裝器」,字符流使用字節流來執行物理I/O,而字符流處理字符和字節之間的轉換,例如,FileReader使用FileInputStream,而FileWriter使用FileOutputStreamsegmentfault

有兩種通用的字節到字符「橋接」流:InputStreamReaderOutputStreamWriter,當沒有符合你需求的預打包字符流類時,使用它們來建立字符流。api

面向行的I/O

字符I/O的單位一般比單個字符大,一個常見的單位是行:一串字符,末尾有一個行終止符,行終止符能夠是回車/換行序列(「\r\n」),單個回車符(「\r」)或單個換行符(「\n」),支持全部可能的行終止符容許程序讀取在任何普遍使用的操做系統上建立的文本文件。oracle

讓咱們修改CopyCharacters示例以使用面向行的I/O,爲此,咱們必須使用兩個咱們之前從未見過的類,BufferedReaderPrintWriter編碼

CopyLines示例調用BufferedReader.readLinePrintWriter.println來一次輸入和輸出一行。操作系統

import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;

public class CopyLines {
    public static void main(String[] args) throws IOException {

        BufferedReader inputStream = null;
        PrintWriter outputStream = null;

        try {
            inputStream = new BufferedReader(new FileReader("xanadu.txt"));
            outputStream = new PrintWriter(new FileWriter("characteroutput.txt"));

            String l;
            while ((l = inputStream.readLine()) != null) {
                outputStream.println(l);
            }
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }
}

調用readLine會返回一行文本,CopyLines使用println輸出每一行,println附加當前操做系統的行終止符,這可能與輸入文件中使用的行終止符不一樣。

有許多方法能夠在字符和行以外構建文本輸入和輸出,有關更多信息,請參閱掃描和格式化。


上一篇:字節流

下一篇:緩衝流

相關文章
相關標籤/搜索