我在 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();
确实有效