当前位置: 首页 > 知识库问答 >
问题:

java的 FileOutputStream 带不带缓冲区 ?

有骏奇
2024-01-08

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

共有3个答案

葛修真
2024-01-08

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

龙博
2024-01-08

看FileOutputStream,flush 是直接继承自 OutputStream 的。

而 OutputStream 的 flush 实现是什么也不做。

它没有缓冲区 ,并不意味着它的 flush 不能被调用。

海灵均
2024-01-08

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

 类似资料:
  • 问题内容: awt是否可以进行双缓冲(在Java中)?目前,我知道awt不应该与swing一起使用,所以我不能使用BufferStrategy之类的东西(我已经用awt编写了一些我不想在swing中重写的代码)。 如果使用awt可以进行双缓冲,我是否必须手动写入缓冲区?与swing不同,awt似乎没有相同的内置双缓冲功能。 如果必须手动编写代码,是否有一个不错的教程可以看?还是对于新手程序员来说,

  • 主要内容:创建带缓冲通道,阻塞条件Go语言中有缓冲的通道(buffered channel)是一种在被接收前能存储一个或者多个值的通道。这种类型的通道并不强制要求 goroutine 之间必须同时完成发送和接收。通道会阻塞发送和接收动作的条件也会不同。只有在通道中没有要接收的值时,接收动作才会阻塞。只有在通道没有可用缓冲区容纳被发送的值时,发送动作才会阻塞。 这导致有缓冲的通道和无缓冲的通道之间的一个很大的不同:无缓冲的通道保证进

  • 问题内容: 我是Spatialite的新手。我有以下查询: 我实际上想创建100米的缓冲区并了解其中包含的链接。 我可以找到插入的“ 100”实际上是度值,它为我提供了该范围内的输出。 我也可以在查询中输入度值,但是在世界范围内,从度到米/公里的转换并不相同。我经过许多站点,能够知道1度=大约110公里。但是从GIS专家和一些参考站点也可以了解到地球上的每个极点都是不同的。 例如,对于平面近似,度

  • 我试图用progressbar修改Koush的下载示例中的代码,使其写入FileOutputStream而不是File,但eclipse给出了以下错误: ResponseFuture类型未定义方法progressHandler(new ProgressCallback(){}) 代码如下:

  • 我正在将spring 4.1与ehcache一起使用。我可以用整数键缓存字符串值,但每当我尝试缓存对象时,它都会失败,不会出现任何错误。我保存在缓存中的模型(POJO)确实实现了hashcode、equals和tostring函数。 ehcache配置如下 Spring配置如下所示 我要缓存的类和方法 如果我将getPerson方法的返回值从Party对象替换为String,它就会工作。有什么想法

  • 主要内容:1 Buffer的基本使用,2 Buffer的容量、位置、限制,3 Buffer的类型,4 Buffer的分配,5 将数据写入Buffer,6 从Buffer读取数据与NIO通道进行交互时,将使用Java NIO缓冲区。如您所知,数据从通道读取到缓冲区,然后从缓冲区写入通道。 缓冲区本质上是一个内存块,您可以在其中写入数据,然后可以在以后再次读取。该内存块包装在NIO Buffer对象中,该对象提供了一组方法,可以更轻松地使用该内存块。 1 Buffer的基本使用 使用Buffer来读