我一直在阅读 InputStream , FileInputStream , ByteArrayInputStream 以及它们的使用方式看起来非常清楚(输出流也是如此)。
我正在努力的是要理解 FilterInputStream&的使用。 FilterOutputStream中:
答案 0 :(得分:17)
FilterInputStream
是the Decorator pattern.
必须扩展此类,因为其构造函数为protected
。派生类将添加其他功能,但仍会公开InputStream
的基本接口。
例如,BufferedInputStream
提供基础输入流的缓冲以使读取数据更快,并且DigestInputStream
计算数据的加密哈希值。
您可以使用此功能向依赖于InputStream
或OutputStream
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()
方法。
其他用途:
答案 2 :(得分:0)
FilterInputStream和FilterOutputStream可以帮助那些希望实现自己的输入/输出流的开发人员。诸如BufferedInputStream之类的实现可以在基本InputStream
API周围添加自己的装饰,同时委托super
类 - 在这种情况下为FilteredInputStream - 他们不需要覆盖的方法。
FilterInputStream
和FilterOutputStream
都不是为最终用户设计的。