确实
final OutputStream output = new FileOutputStream(file);
截断file
(如果已存在)?令人惊讶的是,API documentation for Java 6没有说。 API documentation for Java 7也不是。{3}}。 specification for the language itself对FileOutputStream
类的语义没什么好说的。
我知道
final OutputStream output = new FileOutputStream(file, true);
导致附加到文件。但附加和截断不是唯一的可能性。如果将100个字节写入1000字节文件,则有一种可能性是最终的900字节保持不变。
答案 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来截断可能被第二个进程读取的文件......
此;
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
。