zoukankan      html  css  js  c++  java
  • 字符输出流Writer简要概括

    偷个懒,直接参考上篇字符输入流Reader的形式,其实Reader和Writer本来就大同小异;

    字符输出流Writer

    本篇将对JAVA I/O流中的字符输出流Writer做个简单的概括:

    总得来说,每个字符输出流类都有一个对应的用途,如下:

      • 字符输出流基类:Writer
      • 字节流转字符流:OutputStreamWriter              //往字节输出流中写字符
      • 字符文件写入相关:FileWriter                          //往文件中写字符
      • 字符数组转字符流:CharArrayWriter                //往字符数组中写字符
      • 线程内部通信(管道):PipedWriter                    //往管道中写字符
      • 字符串转字符流:StringWriter                        //往StringBuffer中写入字符,构造字符串
      • 缓冲流:BufferedWriter                                //可装饰其它字符输出流,增加缓冲功能
      • 过滤流:FilterWriter                                     //可装饰其它字符输出流,增加过滤功能
      • 格式化写入字符:PrintWriter:                       //可装饰其它字符输出流,增加格式化写入的数据等功能

    再看下Writer的组成结构(下图,包括字符输入流Reader);

    下面将对各个字符输出流做个详细介绍;

    OutputStreamWriter

    OutputStreamWriter继承字符流抽象类Writer,每个构造方法都包含一个字节流OutputStream入参,可以让我们往字节输出流中写入字符

    PS:无论是构造方法里对字节流的处理(StreamDecoder.forOutputStreamWriter),还是字符流的读取(StreamDecoder.write),底层都是通过StreamDecoder类实现的,有兴趣的可以深入了解~

    举个例子,如下,为方便阅读,不做异常处理:

    package com.pichen.io;
    
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    
    public class IOTest {
        public static void main(String[] args) throws IOException {
            //通过“标准”字节输出流得到一个字符输出流
            Writer writer = new OutputStreamWriter(System.out);
            //往字符流写入字符
            writer.write("hello~");
            //关闭流
            writer.close();
        }
    }

    FileWriter

    FileWriter继承字符流OutputStreamWriter,本地文件写入字符,查看其构造方法,都是先根据传入的参数生成一个FileOutputStream字节流对象,然后调用父类OutputStreamWriter的构造方法得到字符流;

    举个简单的例子:

    package com.pichen.io;
    
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.Writer;
    
    public class IOTest {
        public static void main(String[] args) throws IOException {
            //得到字符输出流
            Writer writer = new FileWriter("C:\test.txt");
            //写入字符
            writer.write('a');
            //刷新该流的缓冲
            writer.flush();
            //关闭流
            writer.close();
        }
    }

    CharArrayWriter

    CharArrayReader可以让我们字符数组中写入字符,在构造方法里可以指定字符数组大小,且后续在write的过程中,会自动增大该字符数组;

    举个简单的例子:

    package com.pichen.io;
    
    import java.io.CharArrayWriter;
    import java.io.IOException;
    
    public class IOTest {
        public static void main(String[] args) throws IOException {
    
            //创建字符流,指定初始缓冲区大小
            CharArrayWriter writer = new CharArrayWriter(6);
    
            //写入字符
            writer.write("aaabbb");
            
            //从字符输出流中得到字符数组
            System.out.println(writer.toCharArray());
            
            //关闭流
            writer.close();
        }
    }

    PipedWriter

    可以通过PipedWriter和PipedReader创建字符流管道,线程间可以通过管道进行通信,注意:一定要同一个JVM中的两个线程;

    PipedWriter一般是要和PipedReader配合使用的,其中一个线程通过PipedWriter往管道写数据,另一个线程通过PipedReader从管道读数据,注意读写都会阻塞线程,如下示例:

    package com.pichen.io;
    
    import java.io.IOException;
    import java.io.PipedReader;
    import java.io.PipedWriter;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class IOTest {
        public static void main(String[] args) throws IOException {
            final PipedWriter pw = new PipedWriter();
            final PipedReader pr = new PipedReader(pw);
    
            ExecutorService es = Executors.newFixedThreadPool(2);
    
            es.execute(new Runnable() {
    
                @Override
                public void run() {
                    try {
                        pw.write("hello~");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
    
            es.execute(new Runnable() {
    
                @Override
                public void run() {
    
                    char[] cbuffer = new char[6];
                    try {
                        // 会导致线程阻塞
                        pr.read(cbuffer, 0, 6);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    System.out.println(cbuffer);
    
                }
            });
        }
    }

    BufferedWriter

    这个字符流可以用来装饰其它字符输出流,可以为其它字符输出流提供字符输出缓冲区,到时一次性写入,避免每次都一个字节一个字节往外部媒介中写入数据,这里用到了设计模式里的装饰器模式,可以参考我之前写的,

    http://www.cnblogs.com/chenpi/p/5173818.html

    被装饰的字符流可以有更多的行为,比如newLine方法等;

    举个使用的例子,读取外部文件:

    package com.pichen.io;
    
    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    
    public class IOTest {
        public static void main(String[] args) throws IOException {
            // 创建一个缓冲字符输出流,这里设定缓冲区大小为10k
            BufferedWriter writer = new BufferedWriter(new FileWriter("C:\test.txt"), 10 * 1024);
    
            // 往缓冲区写入字符
            writer.write("aaa");
            writer.newLine();
            writer.write("bbb");
    
            // 关闭流
            writer.close();
        }
    }

    FilterWriter

    抽象类FilterWriter是实现自定义过滤输出字符流的基类,从源码的实现上来看,仅仅只是简单覆盖了Writer中的所有方法,感觉没什么卵用,因为已经有一个抽象类Writer了;

    StringWriter

    字符输出流,可以构造字符串,其内部是通过StringBuffer实现的,

    举个简单的使用例子

    package com.pichen.io;
    
    import java.io.IOException;
    import java.io.StringWriter;
    
    public class IOTest {
        public static void main(String[] args) throws IOException {
    
            StringWriter writer = new StringWriter();
    
            writer.write("hello ");
            writer.write("world~");
    
            System.out.println(writer.toString());
        }
    }

    PrintWriter

    允许将格式化数据写入到字符输出流中,如下示例,将格式化数据写到控制台上;

    package com.pichen.io;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    public class IOTest {
        public static void main(String[] args) throws IOException {
    
            PrintWriter writer = new PrintWriter(System.out);
    
            writer.write("hello ");
            writer.write("world~");
            
            writer.printf("%5d", 101);
            
            writer.close();
        }
    }
  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/chenpi/p/5366159.html
Copyright © 2011-2022 走看看