[重学Java基础][JavaIO流][Part.4]过滤字符输入输出流
FilterReader 与PushbackReader
概述
FilterReader是用于过滤输入字符的抽象类 PushbackReader是FilterReader的一个具体实现
官方注释
FilterReader是读入过滤字符流的抽象类,这个抽象类的默认方法允许所有流内容通过。继承FilterReader的子类必须重写其中一些方法或者添加附加方法和属性(用于是实现过滤读取)
PushbackReader 允许回滚的字符输入流 继承自FilterReader
源码分析
可以看到FilterReader 基本没有什么自己的方法 全部是继承自Reader的方法
而回退流有自己的回退方法unread
成员变量
提供回滚的缓冲字符数组
private char[] buf;
缓冲数组游标
private int pos;
成员方法
构造方法
public PushbackReader(Reader in, int size) {
super(in);
if (size <= 0) {
throw new IllegalArgumentException("size <= 0");
}
按size大小创建回退缓冲数组
this.buf = new char[size];
this.pos = size;
}
public PushbackReader(Reader in) {
this(in, 1);
}
回退方法 其实就是把读入的内容缓冲到缓冲字符数组中
public int read() throws IOException {
synchronized (lock) {
ensureOpen();
if (pos < buf.length)
return buf[pos++];
else
return super.read();
}
}
代码示例
try (
// 创建一个PushbackReader对象,指定推回缓冲区的长度为64
PushbackReader pr = new PushbackReader(new FileReader(
"d://2017.txt"), 64);
) {
char[] buf = new char[32];
// 用以保存上次读取字符串的内容
String lastContent = "";
int hasRead = 0;
// 循环读取文件内容
while ((hasRead = pr.read(buf)) > 0) {
// 将读取的内容转化为字符串
String content = new String(buf, 0, hasRead);
int targetIndex = 0;
// 将上次读取的字符串和本次读取的字符串拼接起来
// 查看是否包含目标字符串,
// 如果包含目标字符串
if ((targetIndex = (lastContent + content)
.indexOf("干物妹")) > 0) {
// 将本次的内容和上次的内容一起推回缓冲区
pr.unread((lastContent + content).toCharArray());
// 重现定义一个长度为targetIndex的char类型的数组
if (targetIndex > 32) {
buf = new char[targetIndex];
}
// 再次读取指定长度的内容,即目标字符串之前的内容
pr.read(buf, 0, targetIndex);
// 答应读取指定长度的内容
System.out.println(new String(buf, 0, targetIndex));
System.exit(0);
} else {
// 打印上次读取的内容
System.out.println(lastContent);
// 将本次读取的内容设置为上次读取的内容
lastContent = content;
}
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
FilterWriter
概述
官方注释
FilterWriter类是用于写出过滤后字节流的抽象类
该类提供了默认的方法把全部请求传递到包裹的底层流中
以该类作为基类的类需要覆写该类的一些方法并可能需要提供额外的方法和参数
源码分析
FilterWriter类和FilterReader类似
基本没有什么自己的方法 全部是继承自Reader的方法
需要继承FilterWriter并实现自己的方法才可以使用