【问题标题】:Java: FilterInputStream what are the advantages and use compared to other streamsJava:FilterInputStream与其他流相比有什么优势和用途
【发布时间】:2013-07-03 21:30:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: java stream inputstream outputstream


    【解决方案1】:

    FilterInputStreamthe Decorator pattern. 的一个示例

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

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

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

    【讨论】:

    • 好的,但是 BufferedInputStream 和 DigestInputStream 实际上对底层流做了一些事情。 FilterInputStream 有什么作用?
    • 它没有。它基本上是一个扩展子类并覆盖读取和写入函数以添加您可能需要的任何新功能的邀请。当前执行此操作的子类有:BufferedInputStream、CheckedInputStream、CipherInputStream、DataInputStream、DeflaterInputStream、DigestInputStream、InflaterInputStream、LineNumberInputStream、ProgressMonitorInputStream、PushbackInputStream。
    【解决方案2】:

    当你想装饰数据流时使用它们。

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

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

    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 格式之间转换行尾
    • 添加延迟以模拟调制解调器或串行端口或无线网络连接等慢速传输方法。

    【讨论】:

    • FilterInputStream 没有做任何事情来帮助实现过滤数据并正确支持markavailable 等的流。您知道实际上有助于实现输入流装饰器的基类吗?
    【解决方案3】:

    FilterInputStreamFilterOutputStream 可以减轻希望实现自己的输入/输出流的开发人员的工作。诸如BufferedInputStream 之类的实现可以在基本InputStream API 周围添加自己的装饰,同时委派super 类——在这种情况下为FilteredInputStream——它们不需要重写的方法。

    FilterInputStreamFilterOutputStream 都不是为最终用户直接使用而设计的。

    【讨论】:

      猜你喜欢
      • 2017-11-24
      • 2016-07-04
      • 2011-03-13
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多