Java IO 教程

Java IO:FilterWriter 类

在 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 存在的作用

FilterWriter 类存在的主要作用是为 Writer 提供一种灵活的过滤机制,以满足不同场景下对写入数据的处理需求,其作用体现在以下几个方面:

  • 数据转换:在将数据写入底层输出流之前,对数据进行转换。例如,将文本中的特定字符替换为其他字符,或者将数据从一种编码格式转换为另一种编码格式。

  • 数据过滤:根据特定的规则,选择性地写入数据。比如,过滤掉某些敏感信息、特定格式的数据或者不符合要求的字符。

  • 增强功能:为现有的 Writer 增加额外的功能。例如,在写入数据时添加日志记录、统计写入字符的数量等。

常用 FilterWriter 子类

以下是一些常用的 FilterWriter 子类及其简介:

BufferedWriter

BufferedWriter 类为另一个 Writer 提供缓冲功能。它将字符写入到一个缓冲区,当缓冲区满或者调用 flush() 方法时,才将缓冲区中的内容一次性写入到底层的输出流中,这样可以减少与底层 I/O 设备的交互次数,从而提高写入效率。

PrintWriter

PrintWriter 类提供了方便的打印功能,它可以将各种数据类型(如整数、浮点数、字符串等)以文本形式写入到输出流中。与其他 Writer 不同的是,PrintWriter 不会抛出 IOException,而是提供了一个 checkError() 方法来检查是否发生了错误。

LineNumberWriter

LineNumberWriter 类用于跟踪写入数据的行号。它会为每一行数据分配一个行号,并可以通过 getLineNumber() 方法获取当前的行号。

CharArrayWriter

CharArrayWriter 是一个基于字符数组的输出流,它可以将字符写入到一个内部的字符数组中。当写入完成后,可以通过 toCharArray() 方法获取存储所有写入字符的字符数组。

自定义 FilterWriter

以下是一个简单的自定义 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 对其进行包装,将输入字符串写入后输出结果。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号