首页 > 解决方案 > 如何在 Java 中打开不阻止外部“安全保存”的文件?

问题描述

我们想用 Java 打开一个文件并读取它的内容。

该文件可以由外部应用程序使用Safe Save进行更新。这意味着该文件将被外部读取,其更新的内容将存储到一个新文件中。最终原始文件被删除,新文件被重命名以匹配原始文件的名称。

不幸的是,当我们的 Java 应用程序同时读取原始文件时,外部进程在重命名(安全保存的最后一部分)期间失败。我们使用了不同类型的打开模式,但无法获得不会让外部阅读器失败的解决方案。

有什么方法可以打开一个不会干扰访问同一文件的外部进程的文件?理想情况下,每当外部进程移动或删除文件时,我们都希望在 Java 应用程序中获得异常。而且只有那里。

您对如何实现这一目标有任何想法吗?

编辑:

只是关于用例的一些说明:

这是一个类似索引器的场景。我们希望索引一个可能非常大的文件系统的内容,其中第 3 方独立进程也可以同时读取或写入。我们无法控制第 3 方流程。复制原始文件似乎是一个很大的开销,我们不确定这是否有助于解决原始问题,因为它可能也会使外部阅读器在安全保存时失败。

最后但同样重要的是:这应该适用于 Windows 和 Linux。但是我们在 Windows 上遇到了这个问题。

标签: javafile

解决方案


在 Windows 上,文件打开时是否可以重命名或删除由FILE_SHARE_DELETE共享模式标志控制。当使用低级CreateFile函数打开文件时,应传入此标志。

不幸的是,Java API 不能让您控制低级别的特定于 Windows 的标志。有一个打开的错误报告默认添加 FILE_SHARE_DELETE,但由于向后兼容性(某些应用程序可能依赖此行为),它不太可能完成。报告中的 A 注释建议了一种解决方法:而不是new FileInputStream(file)使用 java.nio API。

InputStream in = Files.newInputStream(file.toPath());

我现在无权访问 Windows 来验证此解决方法是否使用了正确的共享模式。


推荐阅读