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

时间:2013-07-05 18:05:36

标签: java stream inputstream outputstream

我一直在阅读 InputStream FileInputStream ByteArrayInputStream 以及它们的使用方式看起来非常清楚(输出流也是如此)。

我正在努力的是要理解 FilterInputStream&的使用。 FilterOutputStream中

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

3 个答案:

答案 0 :(得分:17)

FilterInputStreamthe Decorator pattern.

的示例

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

例如,BufferedInputStream提供基础输入流的缓冲以使读取数据更快,并且DigestInputStream计算数据的加密哈希值。

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

答案 1 :(得分:3)

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

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

例如,您可能希望从某个流中删除所有多个空格。您创建自己的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格式之间的行结尾
  • 添加延迟以模拟调制解调器或串行端口或无线网络连接等慢速传输方法。

答案 2 :(得分:0)

FilterInputStreamFilterOutputStream可以帮助那些希望实现自己的输入/输出流的开发人员。诸如BufferedInputStream之类的实现可以在基本InputStream API周围添加自己的装饰,同时委托super类 - 在这种情况下为FilteredInputStream - 他们不需要覆盖的方法。

FilterInputStreamFilterOutputStream都不是为最终用户设计的。