(这是一个假设的问题,因为它非常广泛,并且针对特定情况存在变通方法。)
是否可以将byte[]
原子地写入文件(FileOutputStream
或FileWriter
?
如果写入失败,则编写部分数组是不可接受的。例如,如果数组为1,000,000字节且磁盘在500,000字节后已满,则不应将任何字节写入文件,否则应以某种方式回滚更改。如果媒体在写入中间物理断开连接,情况甚至应该是这种情况。
假设已知数组的最大大小。
答案 0 :(得分:5)
无法对文件进行原子写入。操作系统不支持它,因为它们不支持它,编程语言库也不能支持它。
在传统文件系统中使用文件最好的是原子文件重命名;即
FileDescriptor.sync()
确保编写新文件将旧文件重命名为旧文件;例如使用
java.nio.file.Files.move(Path source, Path target,
CopyOption... options)
使用CopyOptions ATOMIC_MOVE
。根据{{3}},可能不支持此功能,但如果不支持,您应该获得例外。
但请注意,原子性是在操作系统中实现的,如果操作系统无法提供足够强大的保证,那么你就不走运了。
(一个问题是在发生硬盘错误时可能发生的情况。如果磁盘完全死亡,那么原子性是没有意义的。但是如果操作系统在失败后仍然能够读取磁盘,那么结果取决于操作系统修复文件系统的能力。)