我一直在阅读有关 InputStream、FileInputStream 和 ByteArrayInputStream 的内容,它们的使用方式似乎很清晰(输出流也是如此)。
我对理解 FilterInputStream & FilterOutputStream 的用途感到困惑:
- 与其他流类相比,使用它的优点是什么?
- 何时应该使用它?
- 请提供理论解释和一个基本示例。
我一直在阅读有关 InputStream、FileInputStream 和 ByteArrayInputStream 的内容,它们的使用方式似乎很清晰(输出流也是如此)。
我对理解 FilterInputStream & FilterOutputStream 的用途感到困惑:
FilterInputStream
是装饰器模式的一个例子。
由于其构造函数是protected
的,因此必须扩展此类。派生类将添加其他功能,但仍将公开InputStream
的基本接口。
例如,BufferedInputStream
提供底层输入流的缓冲以加快读取数据的速度,而DigestInputStream
在消耗数据时计算数据的加密哈希。
InputStream
或OutputStream
API的现有代码添加功能。例如,假设您使用某个库将数据保存到OutputStream
中。数据变得过大,因此您想要添加压缩功能。您可以修改应用程序,使其“装饰”当前创建的流与ZipOutputStream
一起使用,而不是修改数据持久性库。该库将像使用缺少压缩的旧版本一样使用流。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()
方法进行操作。
其他用途:
mark
、available
等流提供任何帮助。你知道有哪个基类可以真正帮助实现输入流装饰器吗? - Aleksandr DubinskyFilterInputStream和FilterOutputStream旨在为希望实现自己的输入/输出流的开发人员提供便利。例如,BufferedInputStream等实现可能会在基本的InputStream
API周围添加自己的装饰,同时委托给super
类-在这种情况下是FilteredInputStream-他们不需要覆盖的方法。
既不建议直接使用FilterInputStream
,也不建议直接使用FilterOutputStream
。