原子地将byte []写入文件

时间:2017-11-22 12:10:10

标签: java file stream

(这是一个假设的问题,因为它非常广泛,并且针对特定情况存在变通方法。)

是否可以将byte[]原子地写入文件(FileOutputStreamFileWriter

如果写入失败,则编写部分数组是不可接受的。例如,如果数组为1,000,000字节且磁盘在500,000字节后已满,则不应将任何字节写入文件,否则应以某种方式回滚更改。如果媒体在写入中间物理断开连接,情况甚至应该是这种情况。

假设已知数组的最大大小。

1 个答案:

答案 0 :(得分:5)

无法对文件进行原子写入。操作系统不支持它,因为它们不支持它,编程语言库也不能支持它。

在传统文件系统中使用文件最好的是原子文件重命名;即

  1. 将新文件写入与旧文件相同的文件系统
  2. 使用FileDescriptor.sync()确保编写新文件
  3. 将旧文件重命名为旧文件;例如使用

      java.nio.file.Files.move(Path source, Path target, 
                               CopyOption... options) 
    

    使用CopyOptions ATOMIC_MOVE。根据{{​​3}},可能不支持此功能,但如果不支持,您应该获得例外。

  4. 但请注意,原子性是在操作系统中实现的,如果操作系统无法提供足够强大的保证,那么你就不走运了。

    (一个问题是在发生硬盘错误时可能发生的情况。如果磁盘完全死亡,那么原子性是没有意义的。但是如果操作系统在失败后仍然能够读取磁盘,那么结果取决于操作系统修复文件系统的能力。)