gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:46:28 24 4
gpt4 key购买 nike

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

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

如果写入失败,那么数组的一部分被写入是 Not Acceptable 。例如,如果阵列为 1,000,000 字节,并且磁盘在 500,000 字节后已满,则不应将任何字节写入文件,或者应以某种方式回滚更改。如果介质在写入过程中物理断开连接,情况甚至应该如此。

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

最佳答案

无法对文件进行原子写入。操作系统不支持它,并且由于不支持,编程语言库也无法做到这一点。

使用传统文件系统中的文件可以获得的最好效果是原子文件重命名;即

  1. 将新文件写入与旧文件相同的文件系统

  2. 使用FileDescriptor.sync()确保写入新文件

  3. 将新文件重命名为旧文件;例如使用

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

    使用 CopyOptions ATOMIC_MOVE。根据javadocs ,这可能不受支持,但如果不支持,您应该会得到一个异常(exception)。

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

(一个问题是,如果硬盘发生错误,可能会发生什么。如果磁盘完全失效,那么原子性就没有意义了。但是,如果操作系统在故障后仍然能够从磁盘读取数据,那么结果可能取决于操作系统修复可能不一致的文件系统的能力。)

关于java - 以原子方式将 byte[] 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com