11

 final OutputStream output = new FileOutputStream(file);

截断file如果它已经存在?令人惊讶的是,Java 6 的 API 文档没有说明。Java 7的 API 文档也没有。语言本身的规范对类的语义没有任何规定FileOutputStream

我知道

 final OutputStream output = new FileOutputStream(file, true);

导致附加到文件。但是追加和截断并不是唯一的可能性。如果将 100 字节写入 1000 字节文件,一种可能性是最后的 900 字节保持原样。

4

3 回答 3

10

FileOutputStream没有该append选项截断文件。

请注意,FileOutputStream打开的是Stream,而不是随机访问文件,所以我想它的行为方式确实有意义,尽管我同意文档可以更明确地说明它。

于 2017-07-14T10:11:18.907 回答
3

我在 Windows 2008 x86 和 java 1.6.0_32-b05 上试过这个

我创建了 2 个进程,它们不断地向同一个文件写入一个 1Mb 的字符“b”和另一个 4Mb 的字符“a”。除非我用

out = new RandomAccessFile(which, "rw");
out.setLength(0);
out.getChannel().lock();

我发现第三个阅读器进程可以读取似乎是一个文件,该文件以 1Mb 的 'b' 开头,然后是 'a's

我发现首先写入一个临时文件然后重命名它

File.renameTo

到文件也有效。

我不会依赖 Windows 上的 FileOuputStream 来截断可能被第二个进程读取的文件......

  • 不是新的 FileOutputStream(file)
  • 也不是 FileOutputStream(file, false) (不截断)
  • 也不

这个;

out = new FileOutputStream(which, false);
out.getChannel().truncate(0);
out.getChannel().force(true);

然而

out = new FileOutputStream(which, false);
out.getChannel().truncate(0);
out.getChannel().force(true);
out.getChannel().lock();

确实有效

于 2013-03-18T18:49:44.663 回答
-3

FileOutputStream用于写入最常被覆盖的二进制数据。

如果你在操作文本数据,你最好使用一个FileWriter方便的append方法。

于 2013-03-13T14:10:36.890 回答