Java中如何保证文件的原子移动或异常?

2023-12-22

在我的一个项目中,我对一个 JRE 中的一个文件进行并发写入访问,并且希望通过首先写入临时文件,然后使用原子移动将该临时文件移动到目标来处理该问题。我不关心写入访问的顺序等,我需要保证的是在任何给定时间单个文件都是可用的。我已经知道 Files.move 等,我的问题是我至少查看了该方法的一个实现,它对实现是否真正保证原子移动产生了一些疑问。请看下面的代码:

OpenJDK 的 GrepCode 上的 Files.move http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7u40-b43/java/nio/file/Files.java#Files.move%28java.nio.file.Path%2Cjava.nio.file.Path%2Cjava.nio.file.CopyOption%5B%5D%29

1342        FileSystemProvider provider = provider(source);
1343        if (provider(target) == provider) {
1344            // same provider
1345            provider.move(source, target, options);
1346        } else {
1347            // different providers
1348            CopyMoveHelper.moveToForeignTarget(source, target, options);
1349        }

问题是,并非在所有情况下都考虑选项 ATOMIC_MOVE,但源路径和目标路径的位置是唯一重要的事情。这不是我想要的,也不是我理解文档的方式:

如果移动不能作为原子文件系统操作执行,则 抛出 AtomicMoveNotSupportedException。例如,当目标 位置位于不同的 FileStore 上,并且需要复制该文件或目标 位置与该对象的不同提供者相关联。

上面的代码显然违反了该文档,因为它根本不识别 ATOMIC_MOVE 就退回到复制删除策略。在我的情况下,一个例外是完全可以的,因为这样我们服务的托管者可以更改他的设置以仅使用一个支持原子移动的文件系统,因为无论如何这都是我们在系统要求中所期望的。我不想处理的是,仅仅因为实现使用复制删除策略而导致默默失败,这可能会导致目标文件中的数据损坏。因此,根据我的理解,依赖 Files.move 进行原子操作根本不安全,因为如果不支持这些操作,它并不总是失败,但实现可能会退回到复制删除策略。

这种行为是否是实现中的错误,需要提交,或者文档是否允许这种行为,而我理解错误?如果我现在已经知道那里使用了这种可能损坏的实现,那么这有什么区别吗?在这种情况下,我需要自己同步写入访问......


你看错地方了。当文件系统提供者不相同时,操作将委托给moveToForeignTarget正如您在发布的代码片段中看到的那样。方法moveToForeignTarget但是会使用该方法convertMoveToCopyOptions(注意说话的名字……)用于获取翻译操作所需的复制选项。和convertMoveToCopyOptions会抛出一个AtomicMoveNotSupportedException如果遇到ATOMIC_MOVE选项,因为无法将该移动选项转换为有效的复制选项。

所以没有理由担心,一般来说,建议避免看到不到十行代码就草率下结论(特别是在没有尝试过任何测试的情况下)……

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中如何保证文件的原子移动或异常? 的相关文章

随机推荐

  • 如何获取点击列表项的上下文以在 Nativescript 中的另一个页面中显示详细信息

    我正在尝试创建一个列表视图来显示硬编码数组列表中的数据及其工作良好 但我需要使用户能够单击任何项 目以在另一个页面中显示该项目的详细信息 我该怎么做 我尝试创建另一个数组来获取详细信息 并使 BindingContext 及其工作正常 但在
  • 通过 hbase shell 的行键?

    我在用 scan table name COLUMNS gt column family column qualifier LIMIT gt 2 列出 hbase 表中的 2 行 但我想知道是否可以使用 hbase shell 实现以下目标
  • Outlook 电子邮件转 pdf 安全提示

    我有一个任务 需要创建一个将 Outlook 电子邮件转换为 pdf 的程序 这是我的代码 Microsoft Office Interop Outlook Application app new Microsoft Office Inte
  • Google Oauth 弹出取消回调

    使用 Google 身份服务 GSI 时 我可以显示一个弹出窗口 要求用户连接他们的 Google 帐户 这是有很好的文档记录的 并且它与以下代码配合得很好 const client window google accounts oauth
  • SpriteKit:无法更改联系人回调中的节点位置

    我有一个具有动态物理体的节点 我想让它静止并在与另一个物体接触时改变它的位置 我设法使用此问题中提供的解决方案使主体静态 Sprite Kit 断言失败 typeA b2 dynamicBody typeB b2 dynamicBody h
  • 收集 Shiny R 中的所有输入标签

    受到这个答案的启发 收集整个 Shiny 应用程序中的所有用户输入 https stackoverflow com questions 41031584 collect all user inputs throughout the shin
  • SQLite 的 Android 持久性替代方案

    Android 中除了 SQLite 之外还有其他替代方案可以在手机中保存数据吗 我正在寻找类似 iOS coredata 的东西或更简单的东西 如键值存储 如果我们需要将其嵌入到应用程序中 尺寸相对较小的东西也很棒 谢谢您的帮助 如果您只
  • 搜索排序列表? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 什么是搜索或操作排序的 Pythonic 方法sequence https docs python or
  • 丢失 UDP 数据包的可能性有多大?

    好的 我正在为网络课程编程 并且必须使用 UDP 在 Java 中实现一个项目 我们正在实现一个 HTTP 服务器和客户端以及一个以指定概率损坏数据包的 gremlin 功能 HTTP 服务器必须在应用层将大文件分成多个段 以便通过 UDP
  • 实体框架/LINQ to SQL 数据绑定是否使用反射?

    如果之前有人问过这个问题 请原谅我 我进行了搜索 但找不到任何具体回答这个问题的内容 但我很乐意被推荐 我正在查看实体框架和 LINQ to SQL 虽然我喜欢这些系统 当然还有 LINQ 集成 但我对数据绑定方面有点怀疑 我获取了查询结果
  • 如何在Cocos2d-X中交换CCSprite对象中的精灵

    我有一个从 CCSprite 继承的对象 我想从这个对象内部改变图像 如何在 Cocos2d X 中更改图像 精灵 而不创建新的 CCSprite 对象 谢谢 阿德里安 mySprite gt setTexture CCTextureCac
  • ThreadPoolExecutor:任务正在排队但未提交

    我们有一个场景 提交给 ThreadPoolExecutor 的任务长时间运行 当线程池启动时 我们以核心池大小 5 最大池大小 20 和队列大小 10 来启动它 在我们的应用程序中 大约有 10 个任务被提交 大多数时候 这些任务运行几分
  • opencv_createsamples:找不到命令

    每次我运行命令opencv createsamples 我遇到了这个错误 我知道我需要跑步opencv来自 src 但我不知道如何完全做到这一点 有人可以给我一个详细而简单的解释 说明我将如何解决这个问题吗 None
  • 将帮助库移至其他位置

    我有一个 SSD 作为系统驱动器 C 它是一个真正的救星 但是这里的可用空间非常有价值 所以我希望将非重要文件远离此驱动器 主要磁盘之一 eater is the VisualStudio 帮助库在本地模式下使用 我在网上搜索过 但没有运气
  • 加油站动态规划

    您和您的朋友正开车前往蒂华纳度春假 您正在为旅行省钱 因此您希望尽量减少途中的汽油费用 为了最大限度地减少您的天然气成本 您和您的朋友整理了以下信息 首先 您的汽车可以通过一箱油可靠地行驶 m 英里 但不能再远 您的一位朋友从网上挖掘了加油
  • POCO 与实体框架生成的类? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何显示隐藏在导航栏后面的弹出窗口

    我是 Bootstrap 和 Angular 的新手 在我的网页中有一个按钮 我为这样的跨度提供一个弹出窗口 span style padding 5px DOWNLOAD span 但它隐藏在导航栏下 根据我的谷歌搜索 我发现在 html
  • Java图像缩放japplet

    我正在尝试制作一个小程序 允许我打开 放大和缩小图像 我有一个正在运行的小程序 但在缩放方面遇到了问题 关于从这里前往哪里有什么想法吗 这就是我到目前为止所拥有的 图像缩放 import javax swing import java aw
  • Java iText 页脚

    我正在尝试使用 JSP 页面生成 PDF 我的编码大纲如下 Document document new Document PageSize A4 70 Left 70 Right 140 Top 30 Bottom response set
  • Java中如何保证文件的原子移动或异常?

    在我的一个项目中 我对一个 JRE 中的一个文件进行并发写入访问 并且希望通过首先写入临时文件 然后使用原子移动将该临时文件移动到目标来处理该问题 我不关心写入访问的顺序等 我需要保证的是在任何给定时间单个文件都是可用的 我已经知道 Fil