天天看点

Java IO之Reader/Writer

Reader和Writer:

Java 1.1对基本的I/O进行了修改,增加了Reader/Writer,但它们并不是用来替代InputStream和OutputStream的。InputStream/OutputStream面向字节,而Reader/Writer兼容Unicode且面向字符。

适配器:

有的时候我们必须把来自于“字节”层次结构中的类和来自“字符”层次结构中的类结合起来使用。为了实现这个目的,需要用到“适配器(Adapter)”类。InputStreamReader可以把InputStream转换为Reader,OutputStreamWriter可以把OutputStream转换为Writer。

Reader的子类:

CharArrayReader    对应于ByteArrayInputStream
FileReader         Reader/InputStreamReader下的子类,对应于FileInputStream
PipedReader        对应于PipedInputStream
StringReader       对应于StringBufferInputStream(已废弃)
FilterReader       对应于FilterInputStream
BufferedReader     对应于BufferInputStream,但它是直接继承Reader的。
LineNumberReader   Reader/BufferedReader下的子类,对应于LineNumberInputStream。
PushbackReader     Reader/FilterReader下的子类,对应于PushbackInputStream。
           

Writer的子类:

CharArrayWriter    对应于ByteArrayOutputStream
FileWriter         Reader/InputStreamReader下的子类,对应于FileOutputStream
PipedWriter        对应于PipedOutputStream
StringWriter       无相应的类
FilterWriter       对应于FilterOutputStream(抽象类,但没有子类)
BufferedWriter     对应于BufferOutputStream,但它是直接继承Reader的。
PrintWriter        对应于PrintStream
           

代码实例:

1 CharArrayReader/CharArrayWriter

public void testCharArray(){
        char[] c={'a','b','c','d'};
        CharArrayReader r=new CharArrayReader(c);
        r.skip();
        char temp=(char) r.read();
        CharArrayWriter w=new CharArrayWriter();
        w.write(temp);
        System.out.println(w.size());
        System.out.println(w.toString());
    }
    /*
    Output:
    1
    c
    */
           

2 FileReader/FileWriter

public void testFile() {
        File f=new File("FileReaderWriter.txt");
        FileWriter fw=new FileWriter(f);
        fw.write("Hello,this string is writed by FileWriter.");
        /* 此时数据还在缓冲区,需要刷新*/
        fw.flush();
        FileReader fr=new FileReader(f);
        int flag=;
        while (flag!=-){
            flag=fr.read();
            System.out.print((char)flag);
        }
    }
    /*
    Output:
    Hello,this string is writed by FileWriter.
    */
           

3 BufferedReader/BufferWriter

通常建议使用BufferedReader包装所有其read()操作开销可能较大的Reader,如FileReader;使用BufferedWriter包装所有其write()操作开销可能较大的Writer。

public void testBuffered() {
        File f=new File("FileReaderWriter.txt");
        BufferedWriter bw=new BufferedWriter(new FileWriter(f));
        bw.write("This is the first day.\nThis is the second day.");
        bw.flush();
        BufferedReader br=new BufferedReader(new FileReader(f));        FileReader fr=new FileReader(f);
        String s=br.readLine();
        while(s!=null){
            System.out.println(s);
            s=br.readLine();
        }
    }
    /*
    Output:
    This is the first day.
    This is the second day.
    */