java - Java中创建硬链接(hard link)和删除文件的原子操作

标签 java atomic

我正在 Unix 上的 JDK 7 中编写代码来比较两个文件。 如果两个文件相同,则说文件 A 和文件 B。

然后它应该删除文件 B 并创建到文件 A 的硬链接(hard link)。

简单的方法是:

  1. Compare if files are same
    a. delete File B
    b.  use Path to File B to createLink to File A

但问题是这不是原子的。所以出于某种原因,如果我的 Java 代码在第 1 步之后死掉了。我丢失了文件。

一个解决方案是创建备份文件,如果进程执行正常,稍后清理它。

但我正在寻找更优雅的解决方案,我可以在其中将其作为原子操作来执行。请帮忙。

谢谢

最佳答案

我能想到的最安全的方法是在目标目录中创建具有临时名称的硬链接(hard link),然后作为最后一步重命名它,从而覆盖目标。

您的基本算法将类似于以下代码段:

if (FileContentComparator.same(FileA, FileB)) {
    Files.createLink(TempB, FileA);
    TempB.renameTo(FileB);
}

在同一文件系统中重命名文件通常是原子的,因此相当安全。对临时名称使用已知模式将允许找到和处理它们,即使应用程序在执行最终重命名之前意外终止也是如此。

至少File.renameTo()将愉快地覆盖目标而不会遇到任何麻烦——您将不得不调查 Java NIO 类的行为。

关于java - Java中创建硬链接(hard link)和删除文件的原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7988044/

相关文章:

java - JAX-WS 实现包含在 Java 中?

java - 在 shell 中将星号转义为 Java 命令行参数

object - C++11 只能将原始数据类型声明为原子的吗?

java - 机构未创建正确的引擎

java - 这哪里出了问题?线程中的异常 "main"java.lang.ArrayIndexOutOfBoundsException : 5

java - 如何捕获 CompletableFuture 的 whenCompleteAsync 调用中抛出的 RejectedExecutionException?

c++ - 宽松的内存顺序效果是否可以延长到执行线程的生命周期之后?

python - MongoDB 原子性问题——修改内存中的文档

C# 值类型赋值是原子的吗?

java - 原子整数不当行为