Java:FilterInputStream与其他流相比有哪些优势和用途

2022-09-02 01:19:08

我一直在阅读InputStreamFileInputStreamByteArrayInputStream以及它们的使用似乎很清楚(输出流也是如此)。

我正在努力理解FilterInputStream和FilterOutputStream的使用

  • 与其他流类相比,使用它有什么优势?
  • 我应该何时使用它?
  • 请提供理论解释和基本示例。

答案 1

FilterInputStreamDecorator 模式的一个示例。

必须扩展此类,因为它的构造函数是 。派生类将添加其他功能,但仍公开 InputStream 的基本接口。protected

例如,BufferedInputStream 提供基础输入流的缓冲,以加快读取数据的速度,而 DigestInputStream 则在使用数据时计算数据的加密哈希。

您可以使用它向依赖于 或 API 的现有代码添加功能。例如,假设您使用某个将数据保存到 .数据增长过大,因此您需要添加压缩。您可以修改应用程序,使其“修饰”当前使用 ZipOutputStream 创建的流,而不是修改数据持久性库。该库将使用流,就像它使用缺少压缩的旧版本一样。InputStreamOutputStreamOutputStream


答案 2

当您想要修饰数据流时,可以使用它们。

请记住,这些流类实例将自己包裹在另一个流实例(无论是否是其中一个的另一个子类)周围,并添加一些功能,添加一些处理,在数据通过时对数据进行一些更改。

例如,您可能希望从某个流中删除所有多个空格。您可以创建自己的 FilterInputStream 子类并重写该方法。我不打算打扰所有细节,但这里有一些子类中的方法的sora-java:read()

private boolean lastWasBlank = false;
public int read() {
    int chr = super.read();
    if (chr == ' ') {
        if (lastWasBlank) {
            return read();
        } else {
            lastWasBlank = true;
        }
    } else {
        lastWasBlank = false;
    }
    return chr;
}

在现实生活中,您可能也会弄乱其他两种方法。read()

其他用途:

  • 记录流经流的所有内容
  • 复制“tee”实用程序,以便以两种方式处理正在读取的流。
  • 在 Windows、Mac 和 Unix/Linux 格式之间转换行尾
  • 添加延迟以模拟慢速传输方法,如调制解调器、串行端口或无线网络连接。

推荐