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

FileWriter和BufferedWriter之间的Java差异

邵修诚
2023-03-14

这两者有什么区别?我只是在学习Java ATM,但似乎我可以双向写入文件,即(我没有复制try-catch块)

FileWriter file = new FileWriter("foo.txt");
file.write("foobar");
file.close();

FileWriter file = new FileWriter("foo.txt");
BufferedWriter bf = new BufferedWriter(file);
bf.write("foobar");
bf.close();

我理解先缓冲数据的概念,那么这是否意味着第一个示例逐个写入字符,第二个示例先将其缓冲到内存中并写入一次?

共有3个答案

严书
2023-03-14

BufferedWriter更高效。如果我的记忆正确,它可以将小的写操作保存下来,并将写操作保存在一个更大的块中。如果你写很多小的东西,我会用BufferedWriter。对操作系统调用写调用,速度较慢,因此尽可能少的写操作通常是可取的。

陆雨华
2023-03-14

你是对的。下面是BufferedWriter的写()方法的外观:

public void write(int c) throws IOException {
    synchronized (lock) {
        ensureOpen();
        if (nextChar >= nChars)
            flushBuffer();
        cb[nextChar++] = (char) c;
    }
}

如你所见,它确实检查缓冲区是否满(if(nextChar

柴嘉禧
2023-03-14

如果

  • 在刷新/关闭之间进行多次写入
  • 与缓冲区大小相比,写操作很小

在您的示例中,您只有一次写入,因此BufferedWriter只需添加您不需要的开销。

这是否意味着第一个例子一个接一个地写入字符,第二个第一个将其缓冲到内存中并写入一次

在这两种情况下,字符串都会立即写入。

如果您只使用FileWriter,那么就可以编写(字符串)调用

 public void write(String str, int off, int len) 
        // some code
        str.getChars(off, (off + len), cbuf, 0);
        write(cbuf, 0, len);
 }

这使得一个系统调用,每次调用写入(String)。

BufferedWriter提高效率的地方在于多个小型写入。

for(int i = 0; i < 100; i++) {
    writer.write("foorbar");
    writer.write(NEW_LINE);
}
writer.close();

如果没有BufferedWriter,这可能会200 (2 * 100)系统调用和写入磁盘,这是低效的。使用BufferedWriter,这些都可以一起缓冲,因为默认缓冲区大小为8192个字符,所以只需写入1个系统调用。

 类似资料:
  • 问题内容: 两者之间有什么区别?我只是在学习Java ATM,但似乎可以双向写文件,即(我没有在这里复制try-catch块。) 和 我了解先缓冲数据的概念,这是否意味着第一个示例将字符一个接一个地写入,而第二个第一个示例则将其缓冲到内存中并写入一次? 问题答案: 如果您使用BufferedWriter则效率更高 在刷新/关闭之间有多次写入 与缓冲区大小相比,写操作较小。 在您的示例中,您只有一次

  • 我想知道FileWriter是否缓冲。 在这个SO问题中,它似乎是,然而在这个SO问题中,它似乎不是。(这将是每次写入(...)被调用时的系统调用。 所以基本上读这两个问题 提前感谢。 编辑:通过阅读此API解决了问题,我引用了相关部分: 每次调用write()方法都会导致对给定字符调用编码转换器。在写入底层输出流之前,生成的字节在缓冲区中累积。可以指定此缓冲区的大小,但默认情况下,它对于大多数用

  • 问题内容: 很快就有两个相等运算符:double equals( )和Triple equals( ),两者之间有什么区别? 问题答案: 简而言之: 操作员检查其实例值是否相等, 操作员检查引用是否指向同一实例, 长答案: 类是引用类型,可能有多个常量和变量在幕后引用类的同一单个实例。类引用保留在运行时堆栈(RTS)中,其实例保留在内存的堆区域中。当您控制平等时, 这意味着它们的实例是否彼此相等。

  • 问题内容: 嗨,我正在尝试弄清楚如何复制在C#中但在Java中完成的文本加密。在C#中,仍然让我感到困惑并且似乎无法找到答案的那部分代码是: 基本上,Java中的这段代码等效于什么? 更新: 使用提供的PasswordDeriveBytes代码(第二个代码段),我能够完美地复制C#代码。谢谢Maarten Bodewes。 但似乎无法使其跨平台运行。基本上设置了解码代码(我在C#3.5中无法更改)

  • 问题内容: 我正在学习Java中的Enum,我想知道Java和C ++中Enum的主要区别是什么。谢谢 问题答案: 在C ++中,枚举只是一组命名的整数常量。在Java中,枚举更像是类的命名实例。您可以自定义枚举中可用的成员。 同样,C ++将隐式将枚举值转换为它们的整数等效值,而转换必须在Java中是显式的。 有关更多信息,请参见Wikipedia。

  • 这两种方法:和有什么区别? 请举例说明。