在 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 对其进行包装,将输入字符串写入后输出结果。