首页 > 代码库 > 流之阅读器和书写器(过滤器阅读器和过滤器书写器)

流之阅读器和书写器(过滤器阅读器和过滤器书写器)

InputStreamReaderOutputStreamWriter类就是相当于输入和输出流之上的装饰器,把面向字节的接口改为面向字符的接口。完成之后,就可以在它们之上使用面向字符的过滤器阅读器过滤器书写器。与过滤器流一样,有很多子类可以完成特定的过滤工作,包括:

  • BufferedReader

  • BufferedWriter

  • LineNumberReader

  • PushbackReader

  • PrintWriter

BufferedReaderBufferedWriter类是基于字符的,对应于面向字节的BufferedInputStream和BufferedOutputStream类。BufferedInputStream和BufferedOutputStream中使用一个内部字节数组作为缓冲区,相应地,BufferedReader和BufferedWriter使用一个内部字符数组作为缓冲区。

当程序从BufferedReader读取时,文本会从缓冲区得到,而不是直接从底层输入流或其他文本源读取。当缓冲区请空时,将用尽可能多的文本再次填充,尽管这些文本不是全部都立即需要,这样可以使以后的读取速度更快。当程序写入一个BufferedWriter时,文本被放置在缓冲区中。只有当缓冲区填满或者当书写器显式刷新输出时,文本才会被移到底层输出流或其他目标,这使得写入也要快得多。

BufferedReader和BufferedWriter也有与阅读器和书写器关联的常用方法,如:read(),ready(),writer()和close()。这两个类都有两个构造函数,可以将BufferedReader或BufferedWriter串链到一个底层阅读器或书写器,并设置缓冲区的大小,如果没有设置大小,则使用默认的大小8192字符:

public BufferedReader(Reader in,int bufferSize)
public BufferedReader(Reader in)
public BufferedWriter(Writer out)
public BufferedWriter(Writer out,int bufferSize)

我们使用BufferedReader来对上一节的示例重构一下:

package io;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderTest {
    public static void main(String[] args) {
        //注意这里
        try(BufferedReader reader = new BufferedReader(new InputStreamReader(        
                new FileInputStream(new File("/home/fuhd/text")),"UTF8"),1024)){
            int c;
            StringBuffer sb = new StringBuffer();
            while((c = reader.read()) != -1){
                sb.append((char)c);
            }
            System.out.println(sb.toString());
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

BufferedReader类还有一个readLine()方法,它读取一行文本,并作为一个字符串返回:

public String readLine() throws IOException

这个方法可以替代DataInputStream中已经废弃readLine()方法,它与该方法的行为基本相同。主要的区别在于,通过将BufferedReader串链到InputStreamReader,你可以采用正确的字符集读取行,而不是采用平台的默认编码方式。如例:

package io;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderTest {
    public static void main(String[] args) {
        try(BufferedReader reader = new BufferedReader(new InputStreamReader(    
                new FileInputStream(new File("/home/fuhd/text")),"UTF8"),1024)){
            System.out.println(reader.readLine());    //这里直接读一行
        }catch(IOException e){
            e.printStackTrace();
        }
    }
}

这个BufferedWriter类增加了一个其超类所没有的新方法,名为newLine(),也用于写入一行

public void newLine() throws IOException

这个方法向输出插入一个与平台有关的行分隔符字符串。line.separator系统属性会确定这个字符串是什么:在Unix和Mac OS X下可能是换行,在Mac OS 9下是回车,在windows下是回车/换行对。由于网络协议一般会指定所需的行结束符,所以网络编程中不要使用这个方法,而应当显式地写入协议所需的行结束符。大多数情况下,所需的结束符都是回车/换行对。

流之阅读器和书写器(过滤器阅读器和过滤器书写器)