以原子方式将byte []写入文件

Mar*_*mus 3 java file stream

(这是一个假想的问题,因为它涉及面很广,并且存在针对特定情况的解决方法。)

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

如果写入失败,则写入部分数组是不可接受的。例如,如果数组为1,000,000字节,而磁盘在500,000字节后已满,则不应将字节写入文件,或者应以某种方式回滚更改。如果介质在写入过程中物理断开连接,甚至应该是这种情况。

假定数组的最大大小是已知的。

Ste*_*n C 6

无法对文件进行原子写入。操作系统不支持它,并且由于不支持,所以编程语言库也不能支持它。

在传统文件系统中,使用文件获得的最好的结果就是原子文件重命名。即

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

      java.nio.file.Files.move(Path source, Path target, 
                               CopyOption... options) 
    
    Run Code Online (Sandbox Code Playgroud)

    与CopyOptions ATOMIC_MOVE。根据javadocs,这可能不受支持,但是如果不支持,则应获得一个异常。

但是请注意,原子性是在OS中实现的,如果OS无法提供足够有力的保证,那么您很不走运。

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

  • 否。使用`move`和`ATOMIC_MOVE`,应用程序编写者“知道”该移动将是原子的,否则将引发异常。使用`rename`时,没有指定原子性,因此*可能会导致`rename`失败的情况……非原子地。 (2认同)