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

回到顶部