java的 FileOutputStream 带不带缓冲区 ?
文章说不带 , 既然不带,那为什么还有下面这种写法 ?
回答:
看FileOutputStream,flush 是直接继承自 OutputStream 的。
而 OutputStream 的 flush 实现是什么也不做。
它没有缓冲区 ,并不意味着它的 flush 不能被调用。
回答:
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()
,是个好习惯。
以上是 java的 FileOutputStream 带不带缓冲区 ? 的全部内容, 来源链接: utcz.com/p/945544.html