Java I/O 19 - FilterReader & FilterWriter

  关于 java.io.FilterReader java.io.FilterWriter 的部分笔记,自身实现了完整的输入输出流操作,继承这两个类的子类应该重写其拥有的操作方法API。本文演示代码段的执行环境基于JDK版本1.7

概述

  FilterReader和FilterWriter这两个类分别继承了Reader和Writer,其自身实现了一整套关于输入输出流的默认操作。但是因为FilterReader和FilterWriter被设计成抽象类的缘故,所以任何继承这两个类的子类都应该重写其方法,如果有必要的话可以提供额外的方法和字段。和FilterInputStream/FilterOutputStream类似,FilterReader和FilterWriter在设计时也采用了装饰器的设计模式,继承自FilterReader的子类PushbackReader则是具体的装饰类。

继承关系

1
2
3
4
5
6
7
8
9
// FilterReader
--java.lang.Object
--java.io.Reader
--java.io.FilterReader

// FilterWriter
--java.lang.Object
--java.io.Writer
--java.io.FilterWriter

实现接口

类名 实现接口
FilterReader Closeable, AutoCloseable,Readable
FilterWriter Closeable, Flushable, AutoCloseable, Appendable

FilterReader

Constructor Summary

protected FilterReader(Reader in)

1
2
3
4
protected FilterReader(Reader in) {
super(in);
this.in = in;
}

  初始化一个FilterReader。FilterReader底层依赖一个Reader输入流,所以在初始化时需要传入一个实现了Reader接口的实现类来完成初始化操作,FilterReader类中所有的操作都直接依赖于底层的Reader输入流。

部分方法

public int read()

1
2
3
public int read() throws IOException {
return in.read();
}

  从底层输入流中读取一个字符内容并返回。

public int read(char cbuf[], int off, int len)

1
2
3
public int read(char cbuf[], int off, int len) throws IOException {
return in.read(cbuf, off, len);
}

  从底层输入流中读取长度为len的字符内容并保存到字符数组cbuf中自位置off起的空间里。

public long skip(long n)

1
2
3
public long skip(long n) throws IOException {
return in.skip(n);
}

  跳过底层输入流中长度为n的字符内容。

public boolean ready()

1
2
3
public boolean ready() throws IOException {
return in.ready();
}

  通知方法调用方当前底层输入流是否可以通过read()方法对外提供数据。

public boolean markSupported()

1
2
3
public boolean markSupported() {
return in.markSupported();
}

  通知方法调用方当前底层输入流是否支持标记重读操作。

public void mark(int readAheadLimit)

1
2
3
public void mark(int readAheadLimit) throws IOException {
in.mark(readAheadLimit);
}

  标记底层输入流的当前读取位置。

public void reset()

1
2
3
public void reset() throws IOException {
in.reset();
}

  重置下一次读取位置为最近一次调用mark()方法记录的位置值。

public void close()

1
2
3
public void close() throws IOException {
in.close();
}

  关闭当前输入流。

FilterWriter

Constructor Summary

protected FilterWriter(Writer out)

1
2
3
4
protected FilterWriter(Writer out) {
super(out);
this.out = out;
}

  初始化一个FilterWriter。FilterWriter底层依赖一个Writer输入流,所以在初始化时需传入一个实现了Writer接口的实现类来完成初始化操作,FilterWriter类中所有的操作都直接依赖于底层的Writer输入流。

部分方法

public void write(int c)

1
2
3
public void write(int c) throws IOException {
out.write(c);
}

  向底层输出流中写入一个字符。

public void write(char cbuf[], int off, int len)

1
2
3
public void write(char cbuf[], int off, int len) throws IOException {
out.write(cbuf, off, len);
}

  将字符数组c中的内容写入到底层输出流中。

public void write(String str, int off, int len)

1
2
3
public void write(String str, int off, int len) throws IOException {
out.write(str, off, len);
}

  将字符串str中自off位置起长度为len的内容写入到底层输出流中。

public void flush()

1
2
3
public void flush() throws IOException {
out.flush();
}

  将缓冲区buf中的内容推到目标输出位置上。

public void close()

1
2
3
public void close() throws IOException {
out.close();
}

  关闭当前输出流。

涉及基础知识点

  1. 装饰器模式:

    图 - 1

    根据图1结构所示,Reader和Writer对应图里的Component,FilterReader和FilterWriter对应于图里的Decorator,PushbackReader对应图里的ConcreteDecorator,而继承自Reader和Writer的其他子类则属于ConcreteComponent。ConcreteDecorator角色提供了更为丰富和个性化的操作。

参考文献

  1. [美] Erich Gamma等. Design Patterns: Elements of Reusable Object-Oriented Software[M]. New York:Pearson Education, 2005.




------------- End of this article, thanks! -------------


  版权声明:本文由Nathan R. Lee创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处。
  本文作者为 Nathan R. Lee
  本文标题为 Java I/O 19 - FilterReader & FilterWriter
  本文链接为 https://marcuseddie.github.io/2018/java-FilterReader-FilterWriter.html