在 Java 的输入输出(I/O)体系里,FilterWriter 类处于 java.io 包中,它是一个抽象类,继承自 Writer 类。FilterWriter 类用于实现你自己的过滤 Writer,基本上它只是覆盖了 Writer 中的所有方法。
FilterWriter 类包含一个受保护的 Writer 类型成员变量 out,这个成员变量代表了被包装的底层 Writer 对象,所有实际的写入操作最终都会通过它完成。
FilterWriter 类本身并不实现具体的过滤功能,它只是为开发者提供了一个基础框架,开发者可以通过继承 FilterWriter 类并重写相关的写入方法,来实现自定义的过滤逻辑,从而对要写入的数据进行修改、转换或者选择性写入。
FilterWriter 源码如下:
package java.io;
public abstract class FilterWriter extends Writer {
// 底层对象
protected Writer out;
protected FilterWriter(Writer out) {
super(out);
this.out = out;
}
public void write(int c) throws IOException {
out.write(c);
}
public void write(char cbuf[], int off, int len) throws IOException {
out.write(cbuf, off, len);
}
public void write(String str, int off, int len) throws IOException {
out.write(str, off, len);
}
public void flush() throws IOException {
out.flush();
}
public void close() throws IOException {
out.close();
}
}FilterWriter 类存在的主要作用是为 Writer 提供一种灵活的过滤机制,以满足不同场景下对写入数据的处理需求,其作用体现在以下几个方面:
数据转换:在将数据写入底层输出流之前,对数据进行转换。例如,将文本中的特定字符替换为其他字符,或者将数据从一种编码格式转换为另一种编码格式。
数据过滤:根据特定的规则,选择性地写入数据。比如,过滤掉某些敏感信息、特定格式的数据或者不符合要求的字符。
增强功能:为现有的 Writer 增加额外的功能。例如,在写入数据时添加日志记录、统计写入字符的数量等。
以下是一些常用的 FilterWriter 子类及其简介:
BufferedWriter 类为另一个 Writer 提供缓冲功能。它将字符写入到一个缓冲区,当缓冲区满或者调用 flush() 方法时,才将缓冲区中的内容一次性写入到底层的输出流中,这样可以减少与底层 I/O 设备的交互次数,从而提高写入效率。
PrintWriter 类提供了方便的打印功能,它可以将各种数据类型(如整数、浮点数、字符串等)以文本形式写入到输出流中。与其他 Writer 不同的是,PrintWriter 不会抛出 IOException,而是提供了一个 checkError() 方法来检查是否发生了错误。
LineNumberWriter 类用于跟踪写入数据的行号。它会为每一行数据分配一个行号,并可以通过 getLineNumber() 方法获取当前的行号。
CharArrayWriter 是一个基于字符数组的输出流,它可以将字符写入到一个内部的字符数组中。当写入完成后,可以通过 toCharArray() 方法获取存储所有写入字符的字符数组。
以下是一个简单的自定义 FilterWriter 示例,该示例会过滤掉所有小写字母后再将字符写入输出流:
package com.hxstrive.java_io;
import java.io.FilterWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
// 自定义 FilterWriter 类
public class CustomFilterWriter extends FilterWriter {
protected CustomFilterWriter(Writer out) {
super(out);
}
// 重写 write(int c) 方法,过滤小写字母
@Override
public void write(int c) throws IOException {
if (!Character.isLowerCase(c)) {
super.write(c);
}
}
// 重写 write(char[] cbuf, int off, int len) 方法
@Override
public void write(char[] cbuf, int off, int len) throws IOException {
for (int i = off; i < off + len; i++) {
if (!Character.isLowerCase(cbuf[i])) {
super.write(cbuf[i]);
}
}
}
// 重写 write(String str, int off, int len) 方法
@Override
public void write(String str, int off, int len) throws IOException {
for (int i = off; i < off + len; i++) {
char c = str.charAt(i);
if (!Character.isLowerCase(c)) {
super.write(c);
}
}
}
public static void main(String[] args) {
String input = "Hello, World!";
Writer sw = new StringWriter();
// 创建自定义的 CustomFilterWriter 对象
try (CustomFilterWriter cfw = new CustomFilterWriter(sw)) {
cfw.write(input);
System.out.println(sw.toString());
} catch (IOException e) {
e.printStackTrace();
}
//输出
//H, W!
}
}注意,上面示例的 CustomFilterWriter 类继承自 FilterWriter,重写了 write(int c)、write(char[] cbuf, int off, int len) 和 write(String str, int off, int len) 方法,在这些方法中过滤掉了小写字母。
main() 方法中,创建了一个 StringWriter 作为底层写入器,然后使用自定义的 CustomFilterWriter 对其进行包装,将输入字符串写入后输出结果。