(这是一个假想的问题,因为它涉及面很广,并且存在针对特定情况的解决方法。)
是否可以原子地将a写入byte[]文件(as FileOutputStream或FileWriter?
如果写入失败,则写入部分数组是不可接受的。例如,如果数组为1,000,000字节,而磁盘在500,000字节后已满,则不应将字节写入文件,或者应以某种方式回滚更改。如果介质在写入过程中物理断开连接,甚至应该是这种情况。
假定数组的最大大小是已知的。
无法对文件进行原子写入。操作系统不支持它,并且由于不支持,所以编程语言库也不能支持它。
在传统文件系统中,使用文件获得的最好的结果就是原子文件重命名。即
FileDescriptor.sync()确保写入新文件将新文件重命名为旧文件;例如使用
java.nio.file.Files.move(Path source, Path target,
CopyOption... options)
Run Code Online (Sandbox Code Playgroud)
与CopyOptions ATOMIC_MOVE。根据javadocs,这可能不受支持,但是如果不支持,则应获得一个异常。
但是请注意,原子性是在OS中实现的,如果OS无法提供足够有力的保证,那么您很不走运。
(一个问题是发生硬盘错误时可能发生的情况。如果磁盘完全死掉,那么原子性就没有意义了。但是,如果操作系统在故障后仍然能够读取磁盘,那么结果取决于操作系统的情况。具有修复文件系统的能力。)