20230517 java.io.Writer

发布时间 2023-08-30 17:22:01作者: 流星<。)#)))≦

介绍

  • java.io.Writer

  • public abstract class Writer implements Appendable, Closeable, Flushable

  • 用于写入字符流的抽象类

  • 只有一个抽象方法需要子类实现:public abstract void write(char cbuf[], int off, int len) throws IOException;

  • 字符流相对字节流并不是对等的,字符流的底层是字节流

  • 在子类设计中装饰器模式非常常见,FilterWriter 类是实现装饰器模式的关键类,但是没有几个 Writer 子类实现 FilterWriter

    public abstract class FilterWriter extends Writer {
        protected Writer out;
    }
    
  • Writer 的几个实现类都值得了解

    • 装饰器模式,内部有一个 Writer
      • FilterWriter :装饰器模式的关键类,内部有一个 Writer
      • BufferedWriter :增加缓冲功能,增加 newLine 方法
      • PrintWriter :增加 format , print 系列方法
    • 简单实现
      • CharArrayWriter :使用 char[]
      • StringWriter :使用 StringBuffer
    • 字节流相关:
      • StreamEncoder :将字符流编码为字节流
      • OutputStreamWriter :使用 StreamEncoder ,字节流转字符流,需要设置字符编码 Charset
      • FileWriterOutputStreamWriter 子类,内部使用 FileOutputStream
    • 管道相关:
      • PipedWriter :管道化字符输出流

API

构造函数

  • protected Writer()
  • protected Writer(Object lock)

公共方法

  • append
  • close
  • flush
    • 用于将缓冲区的数据刷出到目标设备(比如文件或控制台)中。在使用 Writer 类时,所有的输出会先被写入缓冲区,然后等到缓冲区满了、缓冲区中有数据需要被输出时,才会将缓冲区的数据刷出。
    • flush 方法用于手动触发将缓冲区的数据刷出操作,使缓冲区中的数据即刻输出,而不必等到缓冲区满了或者缓冲区的自动刷出策略生效。
  • nullWriter
    • 返回一个丢弃所有字符的新 Writer ,对于 write 等方法什么都不做
  • write

代码示例

自定义实现类:在控制台打印字符串

public class MyWriter extends Writer {
    
    @Override
    public void write(char[] cbuf, int off, int len) throws IOException {
        System.out.println(new String(cbuf, off, len));
    }

    @Override
    public void flush() throws IOException {
    }

    @Override
    public void close() throws IOException {
    }

    public static void main(String[] args) throws IOException {
        MyWriter myWriter = new MyWriter();
        myWriter.write("abc");
        myWriter.append("xxx");
    }
}