Java:FilterInputStream与其他流相比有哪些优势和用途
2022-09-02 01:19:08
我一直在阅读InputStream,FileInputStream,ByteArrayInputStream以及它们的使用似乎很清楚(输出流也是如此)。
我正在努力理解FilterInputStream和FilterOutputStream的使用:
- 与其他流类相比,使用它有什么优势?
- 我应该何时使用它?
- 请提供理论解释和基本示例。
我一直在阅读InputStream,FileInputStream,ByteArrayInputStream以及它们的使用似乎很清楚(输出流也是如此)。
我正在努力理解FilterInputStream和FilterOutputStream的使用:
FilterInputStream
是 Decorator 模式的一个示例。
必须扩展此类,因为它的构造函数是 。派生类将添加其他功能,但仍公开 InputStream
的基本接口。protected
例如,BufferedInputStream
提供基础输入流的缓冲,以加快读取数据的速度,而 DigestInputStream
则在使用数据时计算数据的加密哈希。
您可以使用它向依赖于 或 API 的现有代码添加功能。例如,假设您使用某个将数据保存到 .数据增长过大,因此您需要添加压缩。您可以修改应用程序,使其“修饰”当前使用 ZipOutputStream
创建的流,而不是修改数据持久性库。该库将使用流,就像它使用缺少压缩的旧版本一样。InputStream
OutputStream
OutputStream
当您想要修饰数据流时,可以使用它们。
请记住,这些流类实例将自己包裹在另一个流实例(无论是否是其中一个的另一个子类)周围,并添加一些功能,添加一些处理,在数据通过时对数据进行一些更改。
例如,您可能希望从某个流中删除所有多个空格。您可以创建自己的 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()
其他用途: