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附加当前操做系统的行终止符,这可能与输入文件中使用的行终止符不一样。

有许多方法能够在字符和行以外构建文本输入和输出,有关更多信息,请参阅扫描和格式化。


上一篇:字节流

下一篇:缓冲流

相关文章
相关标签/搜索