面向字符的输入流
周sir |
2015年4月17日 |
输入输出(IO)操作 |
0 条评论 | 1750
字符流是按字符而不是按字节来读写的:源或目标通常是文本文件。java.io 里所有字符流的父类是 Reader 和 Writer,二者都是抽象类,实际工作要靠子类。
子类可以分成两类:直接对接数据源或目的地的叫节点流,在流上再做缓冲、转换等处理的叫处理流。本节先看面向字符的输入流。

一、Reader 的类层次
面向字符的输入流都是 Reader 的子类,层次结构如下(原文图 10-2):

主要子类及说明见下面两张原图表(原文表 10-1):


| 类型 |
代表类 |
典型用途 |
| 节点流 |
FileReader |
按字符读文本文件 |
| 处理流 |
BufferedReader |
带缓冲,可按行 readLine() |
| 桥接 |
InputStreamReader |
把字节流解码成字符流 |
二、用 FileReader 读文本
FileReader 是 InputStreamReader 的子类,因此既能用 Reader 的方法,也能用 InputStreamReader 的方法。读文件前要先构造对象,再调用 read()。构造方法:
public FileReader(String name); // 根据文件名创建可读的输入流对象
【例 10-1】用 FileReader 读取纯文本文件:
import java.io.*;
class ep10_1 {
public static void main(String args[]) throws IOException {
char a[] = new char[1000]; // 可容纳 1000 个字符
FileReader b = new FileReader("ep10_1.txt");
int num = b.read(a); // 读入数组 a,返回字符数
String str = new String(a, 0, num);
System.out.println("读取的字符个数为:" + num + ",内容为:\n");
System.out.println(str);
}
}
注意:Java 把一个汉字或一个英文字母都当作一个字符;回车、换行会按两个字符计算。
三、用 BufferedReader 按行读
BufferedReader 读的是缓冲区里的数据。用法是:先建 FileReader,再把它传给 BufferedReader 的构造方法:
public BufferedReader(Reader in); // 创建缓冲字符输入流
public BufferedReader(Reader in, int size); // 同时指定缓冲区大小
【例 10-2】用 BufferedReader 按行读取纯文本:
import java.io.*;
class ep10_2 {
public static void main(String args[]) throws IOException {
String OneLine;
int count = 0;
try {
FileReader a = new FileReader("ep10_1.txt");
BufferedReader b = new BufferedReader(a);
while ((OneLine = b.readLine()) != null) { // 每次读 1 行
count++;
System.out.println(OneLine);
}
System.out.println("\n 共读取了" + count + "行");
b.close();
} catch (IOException io) {
System.out.println("出错了!" + io);
}
}
}
执行 read() / write() 时可能抛出 IOException,读写语句应放进 try,用对应的 catch 处理。
一句话总结:读文本优先 FileReader;要按行、要缓冲,再包一层 BufferedReader,并记得在 try-catch 里关闭流。
转载请注明来源:面向字符的输入流
我是周sir,这是我的博客。致力于分享我学会的技术和优秀的文章。微信公众号 “周sir专栏” 欢迎大家关注。