JavaIO(三):Reader与Writer

Author Avatar
罗炜光 4月 28, 2016
  • 在其它设备中阅读本文章

InputStreamReader

public class Test
{
    public static void main(String[] args) throws IOException
    {
        InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\\Test11.txt"));

        //markSupported() boolean 判断此流是否支持 mark() 操作以及支持哪一项操作。
        System.out.println("markSupported():" + isr.markSupported());
        //ready() boolean 判断此流是否已经准备好用于读取。
        System.out.println("ready():" + isr.ready());
        //read() int 读取单个字符。
        System.out.println("read():" + isr.read());
        char[] chars1 = new char[26];
        //read(char[] cbuf) int 将字符读入数组。
        isr.read(chars1);
        System.out.println("read(char[] cbuf):" + new String(chars1));
        char[] chars2 = new char[26];
        //read(char[] cbuf, int off, int len) int 将字符读入数组的某一部分。
        isr.read(chars2, 0, 13);
        System.out.println("read(char[] cbuf, int off, int len):" + new String(chars2));
        //skip(long ns) long 将该流重置为最新的标记,如果从未标记过,则将其重置到该字符串的开头。
        isr.skip(1);
        //close() void 关闭该流并释放与之关联的所有系统资源。
        isr.close();
    }
}

E:\Test11.txtCharArrayWriter输出

FileReader

public class Test
{
    public static void main(String[] args) throws IOException
    {
        FileReader fr = new FileReader("E:\\Test11.txt");

        //markSupported() boolean 判断此流是否支持 mark() 操作以及支持哪一项操作。
        System.out.println("markSupported():" + fr.markSupported());
        //ready() boolean 判断此流是否已经准备好用于读取。
        System.out.println("ready():" + fr.ready());
        //read() int 读取单个字符。
        System.out.println("read():" + fr.read());
        char[] chars1 = new char[26];
        //read(char[] cbuf) int 将字符读入数组。
        fr.read(chars1);
        System.out.println("read(char[] cbuf):" + new String(chars1));
        char[] chars2 = new char[26];
        //read(char[] cbuf, int off, int len) int 将字符读入数组的某一部分。
        fr.read(chars2, 0, 13);
        System.out.println("read(char[] cbuf, int off, int len):" + new String(chars2));
        //skip(long ns) long 将该流重置为最新的标记,如果从未标记过,则将其重置到该字符串的开头。
        fr.skip(1);
        //close() void 关闭该流并释放与之关联的所有系统资源。
        fr.close();
    }
}

PushbackReader

public class Test
{
    public static void main(String[] args) throws IOException
    {
        PushbackReader pr = new PushbackReader(new FileReader("E:\\Test.txt"),1024);

        //markSupported() boolean 判断此流是否支持 mark() 操作以及支持哪一项操作。
        System.out.println("markSupported():" + pr.markSupported());
        //ready() boolean 判断此流是否已经准备好用于读取。
        System.out.println("ready():" + pr.ready());
        //read() int 读取单个字符。
        System.out.println("read():" + pr.read());
        char[] chars1 = new char[26];
        //read(char[] cbuf) int 将字符读入数组。
        pr.read(chars1);
        System.out.println("read(char[] cbuf):" + new String(chars1));
        char[] chars2 = new char[26];
        //read(char[] cbuf, int off, int len) int 将字符读入数组的某一部分。
        pr.read(chars2, 0, 13);
        System.out.println("read(char[] cbuf, int off, int len):" + new String(chars2));
        //unread(char[] cbuf, int off, int len) void 推回字符数组的某一部分,方法是将其复制到推回缓冲区的前面。
        pr.unread(chars2, 0, 13);
        //unread(char[] cbuf) void 推回一个字符数组,方法是将其复制到推回缓冲区前面。
        pr.unread(chars1);
        //unread(int c) void 推回单个字符:将其复制到推回缓冲区的前面。
        pr.unread(97);
        //reset() void 重置该流。
        pr.reset();
        //skip(long ns) long 将该流重置为最新的标记,如果从未标记过,则将其重置到该字符串的开头。
        pr.skip(1);
        //close() void 关闭该流并释放与之关联的所有系统资源。
        pr.close();
    }
}

CharArrayReader

public class Test
{
    public static void main(String[] args) throws IOException
    {
        char[] chars1 = new char[512];
        for(int i = 0;i < chars1.length;i++)
        {
            chars1[i] = (char) ('a' + i%26);
        }
        CharArrayReader car = new CharArrayReader(chars1);
        //markSupported() boolean 判断此流是否支持 mark() 操作以及支持哪一项操作。
        System.out.println("markSupported():" + car.markSupported());
        //ready() boolean 判断此流是否已经准备好用于读取。
        System.out.println("ready():" + car.ready());
        //mark(int readAheadLimit) void 标记流中的当前位置。
        car.mark(0);
        //read() int 读取单个字符。
        System.out.println("read():" + car.read());
        char[] chars2 = new char[26];
        //read(char[] cbuf) int 将字符读入数组。
        car.read(chars2);
        System.out.println("read(char[] cbuf):" + new String(chars2));
        char[] chars3 = new char[26];
        //read(char[] cbuf, int off, int len) int 将字符读入数组的某一部分。
        car.read(chars3, 0, 13);
        System.out.println("read(char[] cbuf, int off, int len):" + new String(chars3));
        //reset()  void 将该流重置为最新的标记,如果从未标记过,则将其重置到该字符串的开头。
        car.reset();
        //skip(long ns) long 将该流重置为最新的标记,如果从未标记过,则将其重置到该字符串的开头。
        car.skip(1);
        //close() void 关闭该流并释放与之关联的所有系统资源。
        car.close();
    }
}

BufferedReader

public class Test
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader br = new BufferedReader(new FileReader("E:\\Test11.txt"),1024);

        //markSupported() boolean 判断此流是否支持 mark() 操作以及支持哪一项操作。
        System.out.println("markSupported():" + br.markSupported());
        //ready() boolean 判断此流是否已经准备好用于读取。
        System.out.println("ready():" + br.ready());
        //mark(int readAheadLimit) void 标记流中的当前位置。
        br.mark(1024);
        //read() int 读取单个字符。
        System.out.println("read():" + br.read());
        char[] chars1 = new char[26];
        //read(char[] cbuf) int 将字符读入数组。
        br.read(chars1);
        System.out.println("read(char[] cbuf):" + new String(chars1));
        char[] chars2 = new char[26];
        //read(char[] cbuf, int off, int len) int 将字符读入数组的某一部分。
        br.read(chars2, 0, 13);
        System.out.println("read(char[] cbuf, int off, int len):" + new String(chars2));
        //reset()  void 将该流重置为最新的标记,如果从未标记过,则将其重置到该字符串的开头。
        br.reset();
        //skip(long ns) long 将该流重置为最新的标记,如果从未标记过,则将其重置到该字符串的开头。
        br.skip(1);
        //readLine() String 读取一个文本行。
        System.out.println("readLine():" + br.readLine());
        //close() void 关闭该流并释放与之关联的所有系统资源。
        br.close();
    }
}

StringReader

public class Test
{
    public static void main(String[] args) throws IOException
    {
        StringReader sr = new StringReader("aHello WorldHelloaabcdefghijklmnopqrstuvwxyzabcdefghijklmHelloHello World");
        //markSupported() boolean 判断此流是否支持 mark() 操作以及支持哪一项操作。
        System.out.println("markSupported():" + sr.markSupported());
        //ready() boolean 判断此流是否已经准备好用于读取。
        System.out.println("ready():" + sr.ready());
        //mark(int readAheadLimit) void 标记流中的当前位置。
        sr.mark(0);
        //read() int 读取单个字符。
        System.out.println("read():" + sr.read());
        char[] chars1 = new char[26];
        //read(char[] cbuf) int 将字符读入数组。
        sr.read(chars1);
        System.out.println("read(char[] cbuf):" + new String(chars1));
        char[] chars2 = new char[26];
        //read(char[] cbuf, int off, int len) int 将字符读入数组的某一部分。
        sr.read(chars2, 0, 13);
        System.out.println("read(char[] cbuf, int off, int len):" + new String(chars2));
        //reset()  void 将该流重置为最新的标记,如果从未标记过,则将其重置到该字符串的开头。
        sr.reset();
        //skip(long ns) long 将该流重置为最新的标记,如果从未标记过,则将其重置到该字符串的开头。
        sr.skip(1);
        //close() void 关闭该流并释放与之关联的所有系统资源。
        sr.close();
    }
}

PipedReader与PipedWriter

public class Test
{
    public static void main(String[] args) throws IOException
    {
        PipedReader pr = new PipedReader();
        PipedWriter pw = new PipedWriter();

        pr.connect(pw);

        ReaderThread rt = new ReaderThread(pr);
        WriterThread wt = new WriterThread(pw);

        new Thread(rt).start();  
        new Thread(wt).start();  
    }

}

class ReaderThread implements Runnable
{
    private PipedReader pr;

    public ReaderThread(PipedReader pr)
    {
        this.pr = pr;
    }

    public void run()
    {
        try  
        {  
            System.out.println("PipedReader:读取前没有数据,阻塞中...等待数据传过来再输出到控制台...");
            char[] chars1 = new char[26];
            //read(byte[] b) int 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中
            pr.read(chars1);
            //ready() boolean 判断此流是否已经准备好用于读取。
            System.out.println("ready():" + pr.ready());
            System.out.println("PipedReader:读取数据成功,阻塞解除...");
            System.out.println(new String(chars1));  //将读取的数据流用字符串以字符串打印出来  
            //read() int 读取此传送流中的下一个数据字符。
            System.out.println(pr.read());
            char[] chars2 = new char[26];
            //read(char[] cbuf, int off, int len) int 将此传送流中最多 len 个数据字符读入字符数组。
            pr.read(chars2, 0, 14);
            System.out.println(new String(chars2));
            //markSupported() boolean 判断此流是否支持 mark()操作
            System.out.println(pr.markSupported());
            //close() int 关闭此管道输入流并释放与该流相关的所有系统资源。
            pr.close();       
        }  
        catch(Exception e)  
        {  
            throw new RuntimeException("PipedReader:管道读取流失败!");
        }     
    }
}

class WriterThread implements Runnable
{

    private PipedWriter pw;

    public WriterThread(PipedWriter pw)
    {
        this.pw = pw;
    }

    @Override
    public void run()
    {
        try  
        {
            System.out.println("PipedWriter:开始将数据写入");
            char[] chars1 = new char[26];
            for(int i = 0;i < chars1.length;i++)
            {
                chars1[i] = (char) ('A' + i%26);
            }
            //write(char[] cbuf) void 写入字符数组。 
            pw.write(chars1);
            //write(int c) void 将指定的 char 写入管道输出流。
            pw.write(97); 
            //write(char[] cbuf, int off, int len) int 将 len 将 len 字符从指定初始偏移量为 off 的字符数组写入到此管道输出流。
            pw.write(chars1, 0, 13);
            //flush() void 刷新此输出流并强制写出所有缓冲的输出字符。
            pw.flush();
            //append(char c) Writer 将指定字符添加到此 writer。 
            pw.append('b');
            //append(CharSequence csq) Writer 将指定字符序列添加到此 writer。 
            pw.append("Hello World");
            //append(CharSequence csq,int start,int end) Writer 将指定字符序列的子序列添加到此 writer.Appendable。 
            pw.append("Hello World", 0, 5);
            Thread.sleep(5000);
            //close() void 关闭此管道输出流并释放与此流相关的所有系统资源。
            pw.close();
        }  
        catch(Exception e)  
        {  
            throw new RuntimeException("PipedWriter:WriteThread写入失败...");  
        }  
    }
}

StringWriter

public class Test
{
    public static void main(String[] args) throws IOException
    {
        StringWriter sw = new StringWriter();
        //append(char c) StringWriter 将指定字符添加到此 writer。
        sw.append('a');
        //append(CharSequence csq) StringWriter 将指定的字符序列添加到此 writer。
        sw.append("Hello World");
        //append(CharSequence csq, int start, int end) StringWriter 将指定字符序列的子序列添加到此 writer。
        sw.append("Hello World", 0, 5);
        //write(int c) void 写入单个字符。
        sw.write(97);
        char[] chars1 = new char[26];
        for(int i = 0;i < chars1.length;i++)
        {
            chars1[i] = (char) ('a' + i%26);
        }
        //write(char[] cbuf) void 写入字符数组。 
        sw.write(chars1);
        //write(char[] cbuf, int off,int len) void 写入字符数组的某一部分。
        sw.write(chars1, 0, 13);
        //write(char[] cbuf, int off, int len) void 写入字符数组的某一部分。
        sw.write("Hello World", 0, 5);
        //write(String str) void 写入一个字符串。
        sw.write("Hello World");
        //flush() void  刷新该流的缓冲。
        sw.flush();
        //close() void 关闭 StringWriter 无效。
        sw.close();
        //toString() String 以字符串的形式返回该缓冲区的当前值。
        System.out.println(sw.toString());
        //getBuffer() StringBuffer 返回该字符串缓冲区本身。
        System.out.println(sw.getBuffer());

    }
}

OutputStreamWriter

public class Test
{
    public static void main(String[] args) throws IOException
    {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\Test9.txt"),"UTF-8");
        //write(int c) void 写入单个字符。
        osw.write(97);
        char[] chars1 = new char[26];
        for(int i = 0;i < chars1.length;i++)
        {
            chars1[i] = (char) ('a' + i%26);
        }
        //append(char c) StringWriter 将指定字符添加到此 writer。
        osw.append('a');
        //append(CharSequence csq) StringWriter 将指定的字符序列添加到此 writer。
        osw.append("Hello World");
        //append(CharSequence csq, int start, int end) StringWriter 将指定字符序列的子序列添加到此 writer。
        osw.append("Hello World", 0, 5);
        //write(char[] cbuf) void 写入字符数组。 
        osw.write(chars1);
        //write(char[] cbuf, int off,int len) void 写入字符数组的某一部分。
        osw.write(chars1, 0, 13);
        //write(char[] cbuf, int off, int len) void 写入字符数组的某一部分。
        osw.write("Hello World", 0, 5);
        //write(String str) void 写入一个字符串。
        osw.write("你好,世界");
        //getEncoding() String 返回此流使用的字符编码的名称。
        System.out.println("getEncoding():" + osw.getEncoding());
        //flush() void 刷新该流的缓冲。
        osw.flush();
        //close() void 关闭此流,但要先刷新它。
        osw.close();
    }
}

FileWriter

public class Test
{
    public static void main(String[] args) throws IOException
    {
        FileWriter fw = new FileWriter("E:\\Test10.txt");
        //write(int c) void 写入单个字符。
        fw.write(97);
        char[] chars1 = new char[26];
        for(int i = 0;i < chars1.length;i++)
        {
            chars1[i] = (char) ('a' + i%26);
        }
        //append(char c) StringWriter 将指定字符添加到此 writer。
        fw.append('a');
        //append(CharSequence csq) StringWriter 将指定的字符序列添加到此 writer。
        fw.append("Hello World");
        //append(CharSequence csq, int start, int end) StringWriter 将指定字符序列的子序列添加到此 writer。
        fw.append("Hello World", 0, 5);
        //write(char[] cbuf) void 写入字符数组。 
        fw.write(chars1);
        //write(char[] cbuf, int off,int len) void 写入字符数组的某一部分。
        fw.write(chars1, 0, 13);
        //write(char[] cbuf, int off, int len) void 写入字符数组的某一部分。
        fw.write("Hello World", 0, 5);
        //write(String str) void 写入一个字符串。
        fw.write("你好,世界");
        //getEncoding() String 返回此流使用的字符编码的名称。
        System.out.println("getEncoding():" + fw.getEncoding());
        //flush() void 刷新该流的缓冲。
        fw.flush();
        //close() void 关闭此流,但要先刷新它。
        fw.close();
    }
}

CharArrayWriter

public class Test
{
    public static void main(String[] args) throws IOException
    {
        CharArrayWriter caw = new CharArrayWriter(1024);
        //write(int c) void 写入单个字符。
        caw.write(97);
        char[] chars1 = new char[26];
        for(int i = 0;i < chars1.length;i++)
        {
            chars1[i] = (char) ('a' + i%26);
        }
        //append(char c) StringWriter 将指定字符添加到此 writer。
        caw.append('a');
        //append(CharSequence csq) StringWriter 将指定的字符序列添加到此 writer。
        caw.append("Hello World");
        //append(CharSequence csq, int start, int end) StringWriter 将指定字符序列的子序列添加到此 writer。
        caw.append("Hello World", 0, 5);
        //write(char[] cbuf) void 写入字符数组。 
        caw.write(chars1);
        //write(char[] cbuf, int off,int len) void 写入字符数组的某一部分。
        caw.write(chars1, 0, 13);
        //write(char[] cbuf, int off, int len) void 写入字符数组的某一部分。
        caw.write("Hello World", 0, 5);
        //write(String str) void 写入一个字符串。
        caw.write("你好,世界");
        //toCharArray() char[] 返回输入数据的副本。
        System.out.println("toCharArray():" + new String(caw.toCharArray()));
        FileWriter fw = new FileWriter("E:\\Test11.txt");
        //writeTo(Writer out) void 将缓冲区的内容写入另一个字符流。
        caw.writeTo(fw);
        fw.flush();
        //size() int 返回缓冲区的当前大小。
        System.out.println("size():" + caw.size());
        //reset() void 重置该缓冲区,以便再次使用它而无需丢弃已分配的缓冲区。
        caw.reset();
        //flush() void 刷新该流的缓冲。
        caw.flush();
        //close() void 关闭此流,但要先刷新它。
        caw.close();
    }
}

BufferedWriter

public class Test
{
    public static void main(String[] args) throws IOException
    {
        CharArrayWriter caw = new CharArrayWriter(1024);
        BufferedWriter bw = new BufferedWriter(caw, 2048);
        //write(int c) void 写入单个字符。
        bw.write(97);
        char[] chars1 = new char[26];
        for(int i = 0;i < chars1.length;i++)
        {
            chars1[i] = (char) ('a' + i%26);
        }
        //append(char c) StringWriter 将指定字符添加到此 writer。
        bw.append('a');
        //append(CharSequence csq) StringWriter 将指定的字符序列添加到此 writer。
        bw.append("Hello World");
        //append(CharSequence csq, int start, int end) StringWriter 将指定字符序列的子序列添加到此 writer。
        bw.append("Hello World", 0, 5);
        //write(char[] cbuf) void 写入字符数组。 
        bw.write(chars1);
        //write(char[] cbuf, int off,int len) void 写入字符数组的某一部分。
        bw.write(chars1, 0, 13);
        //write(char[] cbuf, int off, int len) void 写入字符数组的某一部分。
        bw.write("Hello World", 0, 5);
        //write(String str) void 写入一个字符串。
        bw.write("你好,世界");
        //newLine() void 写入一个行分隔符。
        bw.newLine();
        //flush() void 刷新该流的缓冲。
        bw.flush();
        //close() void 关闭此流,但要先刷新它。
        bw.close();
    }
}