关于 java.io.FilterReader 和 java.io.FilterWriter 的部分笔记,自身实现了完整的输入输出流操作,继承这两个类的子类应该重写其拥有的操作方法API。本文演示代码段的执行环境基于JDK版本1.7。
概述
FilterReader和FilterWriter这两个类分别继承了Reader和Writer,其自身实现了一整套关于输入输出流的默认操作。但是因为FilterReader和FilterWriter被设计成抽象类的缘故,所以任何继承这两个类的子类都应该重写其方法,如果有必要的话可以提供额外的方法和字段。和FilterInputStream/FilterOutputStream类似,FilterReader和FilterWriter在设计时也采用了装饰器的设计模式,继承自FilterReader的子类PushbackReader则是具体的装饰类。
继承关系
1 | // FilterReader |
实现接口
类名 | 实现接口 |
---|---|
FilterReader | Closeable, AutoCloseable,Readable |
FilterWriter | Closeable, Flushable, AutoCloseable, Appendable |
FilterReader
Constructor Summary
protected FilterReader(Reader in)
1 | protected FilterReader(Reader in) { |
初始化一个FilterReader。FilterReader底层依赖一个Reader输入流,所以在初始化时需要传入一个实现了Reader接口的实现类来完成初始化操作,FilterReader类中所有的操作都直接依赖于底层的Reader输入流。
部分方法
public int read()
1 | public int read() throws IOException { |
从底层输入流中读取一个字符内容并返回。
public int read(char cbuf[], int off, int len)
1 | public int read(char cbuf[], int off, int len) throws IOException { |
从底层输入流中读取长度为len的字符内容并保存到字符数组cbuf中自位置off起的空间里。
public long skip(long n)
1 | public long skip(long n) throws IOException { |
跳过底层输入流中长度为n的字符内容。
public boolean ready()
1 | public boolean ready() throws IOException { |
通知方法调用方当前底层输入流是否可以通过read()方法对外提供数据。
public boolean markSupported()
1 | public boolean markSupported() { |
通知方法调用方当前底层输入流是否支持标记重读操作。
public void mark(int readAheadLimit)
1 | public void mark(int readAheadLimit) throws IOException { |
标记底层输入流的当前读取位置。
public void reset()
1 | public void reset() throws IOException { |
重置下一次读取位置为最近一次调用mark()方法记录的位置值。
public void close()
1 | public void close() throws IOException { |
关闭当前输入流。
FilterWriter
Constructor Summary
protected FilterWriter(Writer out)
1 | protected FilterWriter(Writer out) { |
初始化一个FilterWriter。FilterWriter底层依赖一个Writer输入流,所以在初始化时需传入一个实现了Writer接口的实现类来完成初始化操作,FilterWriter类中所有的操作都直接依赖于底层的Writer输入流。
部分方法
public void write(int c)
1 | public void write(int c) throws IOException { |
向底层输出流中写入一个字符。
public void write(char cbuf[], int off, int len)
1 | public void write(char cbuf[], int off, int len) throws IOException { |
将字符数组c中的内容写入到底层输出流中。
public void write(String str, int off, int len)
1 | public void write(String str, int off, int len) throws IOException { |
将字符串str中自off位置起长度为len的内容写入到底层输出流中。
public void flush()
1 | public void flush() throws IOException { |
将缓冲区buf中的内容推到目标输出位置上。
public void close()
1 | public void close() throws IOException { |
关闭当前输出流。
涉及基础知识点
装饰器模式:
图 - 1根据图1结构所示,Reader和Writer对应图里的Component,FilterReader和FilterWriter对应于图里的Decorator,PushbackReader对应图里的ConcreteDecorator,而继承自Reader和Writer的其他子类则属于ConcreteComponent。ConcreteDecorator角色提供了更为丰富和个性化的操作。
参考文献
- [美] Erich Gamma等. Design Patterns: Elements of Reusable Object-Oriented Software[M]. New York:Pearson Education, 2005.