简介
Java平台使用Unicode约定存储字符值。字符流I / O自动将此内部格式转换为本地字符集。在西方,本地字符集通常是ASCII的8位超集。 对于大多数应用,具有字符流的I / O并不比具有字节流的I / O复杂。使用流类完成输入和输出自动转换为本地字符集和从本地字符集转换。使用字符流代替字节流的程序自动适应本地字符集,并可以进行国际化 - 所有这些无需程序员额外的工作。
如果国际化不是一个优先事项,您可以简单地使用字符流类,而不需要重视字符集问题。但是,如果国际化成为一个优先事项,您的程序可以进行调整,无需广泛的重新编码。有关更多信息,请参阅国际化路径。
使用
所有字符流类都继承于Reader和Writer。与字节流一样,存在专门用于文件I / O的文件流类:FileReader和FileWriter。 CopyCharacters示例说明了这些类:
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();
}
}
}
}
CopyCharacters与CopyBytes非常相似。最重要的区别是CopyCharacters使用FileReader和FileWriter来输入和输出代替FileInputStream和FileOutputStream。请注意,CopyBytes和CopyCharacters都使用int变量来读取和写入。然而,在CopyCharacters中,int变量保存其最后16位的字符值;在CopyBytes中,int变量在其最后8位保存一个字节值字符流——使用字节流
字符流通常是字节流的“包装器”。当字符流处理字符和字节之间的转换时, 字符流使用字节流来执行物理I / O。 例如:FileReader使用FileInputStream,而FileWriter使用FileOutputStream。 有两个通用的字节到字符“桥”流:InputStreamReader和OutputStreamWriter。 当没有满足您需求的预包装字符流类时,可以使用它们来创建字符流。
网络中的套接字课程显示了如何通过套接字类提供的字节流创建字符流
线性IO
字符I / O通常发生在比单个字符更大的单位中。一个常用单位是行:一串字符,末尾有一个行终止符。行终止符可以是回车/换行顺序(“\ r \ n”),单个回车(“\ r”)或单行换行(“\ n”)。支持所有可能的线路终端器允许程序读取在任何广泛使用的操作系统上创建的文本文件。
我们使用线性IO去修改CopyCharacters示例。要做到这一点,我们必须使用我们以前没有用到的两个类,BufferedReader和PrintWriter。我们将在缓冲I / O和格式化中更深入地探索这些类。现在,我们只是对支持线性I / O感兴趣。 CopyLines示例调用BufferedReader.readLine和PrintWriter.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输出每一行,并附加当前操作系统的行终止符。这可能不是输入文件中使用的行终止符。