FileOutputStream是否截断现有文件

时间:2013-03-13 14:05:36

标签: java file

确实

 final OutputStream output = new FileOutputStream(file);

截断file(如果已存在)?令人惊讶的是,API documentation for Java 6没有说。 API documentation for Java 7也不是。{3}}。 specification for the language itselfFileOutputStream类的语义没什么好说的。

我知道

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

导致附加到文件。但附加和截断不是唯一的可能性。如果将100个字节写入1000字节文件,则有一种可能性是最终的900字节保持不变。

3 个答案:

答案 0 :(得分:5)

没有FileOutputStream选项

append截断文件。

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

答案 1 :(得分: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开头,后跟'a'的

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

File.renameTo

到文件也有效。

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

  • 不是新的FileOutputStream(文件)
  • Nor FileOutputStream(file,false)(不截断)
  • Nor

此;

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();

有效吗

答案 2 :(得分:-3)

FileOutputStream用于写二进制数据,这通常会被覆盖。

如果您正在操作文本数据,最好使用方便append方法的FileWriter