面向字符的输入流

    |     2015年4月17日   |   输入输出(IO)操作   |     0 条评论   |    1751

字符流是按字符而不是按字节来读写的:源或目标通常是文本文件。java.io 里所有字符流的父类是 Reader 和 Writer,二者都是抽象类,实际工作要靠子类。

子类可以分成两类:直接对接数据源或目的地的叫节点流,在流上再做缓冲、转换等处理的叫处理流。本节先看面向字符的输入流。

一、Reader 的类层次

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

═╝╧ё

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

═╝╧ё (2)

═╝╧ё (3)

类型 代表类 典型用途
节点流 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 里关闭流。

转载请注明来源:面向字符的输入流
本文链接地址:https://ai.zhousir.top/?p=240

上一篇:

下一篇:

回复 取消