【问题标题】:Pick up only fully written files in java [closed]在java中只提取完全编写的文件[关闭]
【发布时间】:2013-03-31 12:35:30
【问题描述】:

我在 aix 中有一个目录,它将接收来自外部应用程序的文件。 我的 java 程序应该只选择那些完全由应用程序编写的文件。它不应该选择仍然由外部应用程序编写的不完整文件。 有人可以帮忙提供样品吗?

【问题讨论】:

  • 礼仪你必须使用不能跨平台移植的操作系统锁或者你必须能够在文件名或位置上区分写/不写,或者你必须说时间戳必须是在你触摸它之前 X 秒。对于windows,如果你可以重命名它,它就没有打开。

标签: java jakarta-ee file-io aix


【解决方案1】:

我的方法是先将文件写入“临时”目录。写入文件完成后,应将其移至最终目的地。注意将“临时”和“最终”目录放在同一个文件系统上;否则,File.renameTo() 可能有效,也可能无效。使用 Java 7 时,Files.move() 可能会更好用。

显然,您的应用程序只需检查“最终”目录中的文件,因为您知道该目录中的所有文件都已完全写入。

【讨论】:

    【解决方案2】:

    尝试使用 Apache Camel File Poller 和策略操作系统或文件重命名以检测正在进行的文件访问

    【讨论】:

    • 他们不保证这会奏效。
    【解决方案3】:

    在 Windows 中,无法知道文件何时被锁定以供另一个应用程序写入,我之前遇到过同样的问题。您可以尝试使用 JNotify 来监听事件并处理发生的异常,据我所知没有其他方法,但是在 Unix 中检查文件是否被锁定应该可以完成这项工作new File(fileName).canWrite()

    【讨论】:

      【解决方案4】:

      解决此问题的一种常见方法是在文件完全写入后重命名。

      例如,您的应用程序写入 myFile.txt.tmp,完成后将其重命名为 myFile.txt。这样做您只需忽略以 .tmp... 结尾的文件...

      或者,正如已经说过的,通过 alexcpn 看看 Apache Camel File Component...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-10
        • 1970-01-01
        • 1970-01-01
        • 2019-02-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多