De acordo com a documentação , StandardOpenOption.APPEND
parece que requer o StandardOpenOption.WRITE
.
Se o arquivo for aberto para
WRITE
acesso, os bytes serão gravados no final do arquivo e não no início.Se o arquivo for aberto para acesso de gravação por outros programas, então ele será específico do sistema de arquivos se a gravação no final do arquivo for atômica.
É verdade?
Testei StandardOpenOption.APPEND
apenas com e funciona.
@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());
}
O que o comentário significa?
Se o arquivo for aberto para
WRITE
acesso, os bytes serão gravados no final do arquivo e não no início.
Sim e não.
Sim - a semântica de
APPEND
é definida apenas para um canal aberto com aWRITE
opção. E essa definição só faz sentido para um canal de gravação (ou leitura-gravação).Não - a especificação não requer
WRITE
que ifAPPEND
seja fornecido. E não parece haver nenhuma verificação no código para validar essa (suposta) restrição.Até onde eu sei,
APPEND
em umREAD
canal será simplesmente ignorado. E seu teste sugere que aAPPEND
opção implica aWRITE
opção... pelo menos, na plataforma em que você testou. Esse comportamento faz sentido para mim. Mas, de qualquer forma, isso está fora da especificação.A resposta está em FileChannel#open(path, options, attrs) .
READ
ouTRUNCATE_EXISTING
.