文章说不带 , 既然不带,那为什么还有下面这种写法 ?
在 Java 中,FilterOutputStream
本身并不带缓冲区。它是一个抽象类,用于创建其他类型的输出流,这些输出流可以附加到基础输出流上,并对其进行处理或转换。
然而,在实际使用中,通常会将 FilterOutputStream
与其他具有缓冲区的类一起使用,例如 BufferedOutputStream
。BufferedOutputStream
是一个具有缓冲区的输出流,它可以将数据存储在内部缓冲区中,以便更高效地写入数据。
下面是一种常见的用法,其中 FilterOutputStream
与 BufferedOutputStream
结合使用:
OutputStream outputStream = new FileOutputStream("file.txt");
OutputStream bufferedOutput = new BufferedOutputStream(outputStream);
OutputStream filteredOutput = new SomeFilterOutputStream(bufferedOutput);
// 使用 filteredOutput 进行写入操作
filteredOutput.write(data);
filteredOutput.flush();
在上面的示例中,SomeFilterOutputStream
是继承自 FilterOutputStream
的自定义过滤输出流。虽然 SomeFilterOutputStream
不带缓冲区,但通过将其包装在 BufferedOutputStream
中,我们可以获得缓冲区的优势,并提高写入操作的效率。
因此,尽管 FilterOutputStream
本身不带缓冲区,但在实际应用中,通常会与其他具有缓冲区的类一起使用,以便更好地处理和转换数据。
FileOutputStream
不带缓存区,但它可以被继承,所以它的子类是不是带缓冲区就不得而知了,比如
class BufferedFileOutputStream extends FileOutputStream {
// 这里是带缓冲区的实现
}
FileOutputStream fos = new BufferedFileOutputStream(...);
...
fos.flush();
fos.close();
这种情况下,加 flush 是有必要的。
当然题上很明确的 new FileOutputStream()
,不要 flush 本身没什么问题。但是,随着项目的继续开发,变得复杂之后,有可能会出现这样的变化
进化一:把 new FileOutputStream()
修改为工厂来生成对象,比如 createFileOutputStream
,
FileOutputStream createFileOutputStream(args) {
// 对参数进行一些处理,然后
return new FileOutputStream(...);
}
接下来,进一步进化,createFileOutputStream()
可以产生一个 BufferedFileOutputStream
对象(也许是根据参数来产生)
那这时候,如果外面的代码没有 flush 就可能引起缺陷。而对于一个修改 createFileOutputStream
的程序员来说,它不一定会想到去查看和修改使用的地方。甚至,如果 createFileOutputStream
是在另一个库里,那就更不可能去检查使用。
因此……习惯性的加上 .flush()
,是个好习惯。
8 回答6.4k 阅读
1 回答4.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
2 回答3.2k 阅读
2 回答3.9k 阅读
3 回答1.7k 阅读✓ 已解决
1 回答2k 阅读✓ 已解决
看FileOutputStream,flush 是直接继承自 OutputStream 的。
而 OutputStream 的 flush 实现是什么也不做。
它没有缓冲区 ,并不意味着它的 flush 不能被调用。