StandardOpenOption.APPEND 是否需要 StandardOpenOption.WRITE?

问题描述 投票:0回答:1

根据文档

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
访问,则字节将写入文件末尾而不是开头。

java java-nio
1个回答
0
投票

答案就在 FileChannel#open(path, options, attrs)

选项 描述
追加 如果存在此选项,则打开文件进行写入,并且每次调用通道的写入方法首先将位置前进到文件末尾,然后写入请求的数据。位置的推进和数据的写入是否在单个原子操作中完成是系统相关的,因此未指定。使用此选项在给定位置写入的效果未指定。此选项不得与
READ
TRUNCATE_EXISTING
选项一起使用。
... ...
© www.soinside.com 2019 - 2024. All rights reserved.