Será RandomAccessFile.close () chamada internamente FileChannel.force ()?
-
21-08-2019 - |
Pergunta
Eu estou usando RandomAccessFile para executar algumas gravações para um arquivo como parte de uma transação. Antes que eu entrego o meu transação, eu quero ter certeza absoluta de que os dados são gravados no disco.
Chamando force(boolean)
em FileChannel
da RAF parece dar essa garantia, mas é chamado implicitamente quando eu fechar o arquivo, ou eu tenho que chamá-lo manualmente?
Além disso, alguém tem qualquer visão sobre o que force()
realmente faz, e até que ponto se pode confiar? É possível que o sistema operacional pode relatar que os dados foram gravados em disco, quando na verdade ele ainda está sentado em algum lugar cache? Até que ponto é este OS / HDD / filesystem-dependente?
Solução
Esta é completamente FS-dependente. Mas se você não fizer uma exceção (IO), você deve confiar na JVM e comprometer sua transação. Se você pode confiar em seus FS é a outra pergunta. Por exemplo, se você usar ext4 tendo alocação atrasada ativado, você poderá perder dados em uma perda de potência instantânea, mesmo depois RandomAccessFile # vigor (boolean) retornado com êxito. O JVM depende da FS-API de seu sistema operacional e não se preocupa com a implementação e configuração real.
E sim, você tem que chamar RandomAccessFile # vigor (boolean) antes de fechar. Se #Fechar invoca #force é até a implementação do FileChannel.