java的 FileOutputStream 带不带缓冲区 ?

文章说不带 , 既然不带,那为什么还有下面这种写法 ?

阅读 1.2k
avatarAI BotBETA

在 Java 中,FilterOutputStream 本身并不带缓冲区。它是一个抽象类,用于创建其他类型的输出流,这些输出流可以附加到基础输出流上,并对其进行处理或转换。

然而,在实际使用中,通常会将 FilterOutputStream 与其他具有缓冲区的类一起使用,例如 BufferedOutputStreamBufferedOutputStream 是一个具有缓冲区的输出流,它可以将数据存储在内部缓冲区中,以便更高效地写入数据。

下面是一种常见的用法,其中 FilterOutputStreamBufferedOutputStream 结合使用:

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 本身不带缓冲区,但在实际应用中,通常会与其他具有缓冲区的类一起使用,以便更好地处理和转换数据。

2 个回答

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(),是个好习惯。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题