我正在用Unix上的JDK 7编写一个代码来比较两个文件。 如果两个文件相同,则说文件A和文件B.
然后它应删除文件B并创建文件A的硬链接。
简单的方法是:
1. Compare if files are same
a. delete File B
b. use Path to File B to createLink to File A
但问题是这不是原子的。因此,出于某种原因,如果我的Java代码在第1步之后死亡。我丢失了文件。
一个解决方案是创建备份文件,如果进程执行正常,请稍后清理它。
但我正在寻找更优雅的解决方案,我可以将其作为原子操作来实现。请帮忙。
由于
答案 0 :(得分:2)
我能想到的最安全的方法是在目标目录中创建一个临时名称的硬链接,然后,作为最后一步,重命名它,从而覆盖目标。
您的基本算法将与以下代码段类似:
if (FileContentComparator.same(FileA, FileB)) {
Files.createLink(TempB, FileA);
TempB.renameTo(FileB);
}
重命名同一文件系统中的文件通常是原子的,因此相当安全。对临时名称使用已知模式将允许查找和处理它们,即使应用程序在执行最终重命名之前意外终止也是如此。
至少File.renameTo()
会愉快地覆盖目标而不会有任何麻烦 - 您必须调查Java NIO类的行为。