根据文档,StandardOpenOption.APPEND
似乎它需要StandardOpenOption.WRITE
。
如果打开文件进行
WRITE
访问,那么字节将被写入文件末尾而不是开头。如果该文件由其他程序打开以进行写访问,并且写入文件末尾是原子的,则它是特定于文件系统的。
这是真的吗?
我StandardOpenOption.APPEND
仅测试了它,并且它有效。
@Test
void __(@TempDir final Path dir) throws Exception {
final var path = Files.createTempFile(dir, null, null);
final var b = ByteBuffer.allocate(12);
try (var channel = FileChannel.open(path, StandardOpenOption.APPEND)) {
while (b.hasRemaining()) {
channel.write(b);
}
channel.force(true);
}
Assertions.assertEquals(Files.size(path), b.capacity());
}
这个评论是什么意思?
如果打开文件进行
WRITE
访问,那么字节将被写入文件末尾而不是开头。
是也不是。
是的 - 的语义
APPEND
仅针对使用选项打开的通道进行定义WRITE
。并且该定义仅对写入(或读写)通道有意义。否 - 规范不要求
WRITE
提供ifAPPEND
。并且代码中似乎没有任何检查来验证这个(假定的)约束。据我所知,频道
APPEND
上的READ
选项将被忽略。而您的测试表明该APPEND
选项暗示了该WRITE
选项……至少在您测试的平台上。这种行为对我来说很有意义。但无论如何,这超出了规范。答案在FileChannel#open(path, options, attrs)上。
READ
或TRUNCATE_EXISTING
选项一起使用。