【问题标题】:premature end of file exception in parsing xml file when another thread is parsing it at the time other thread is creating it当另一个线程在另一个线程正在创建它时解析它时,解析xml文件时文件异常的过早结束
【发布时间】:2011-10-20 06:28:54
【问题描述】:

我有一个 java 线程 A,它不断轮询文件夹 RESULTFOLDER 并检查其中是否存在一些新文件。
现在文件由在另一台机器上运行的其他程序发布到 RESULTFOLDER。现在发布的文件都是 xml 文件(只有 xml)。所以在任何时候 RESULTFOLDER 都只能保存 xml 文件。
现在我的线程 A 不断地轮询 RESULTFOLDER 并一次解析一个 xml 文件,然后将其删除。
现在有时会发生的情况是,如果线程 A 在其他程序发布文件 A 时尝试读取和解析文件 A。在这种情况下,我在解析文件时遇到异常。说文件提前结束。
我该如何解决这个问题?

我认为的一种方法是检查文件创建的日期时间并确保文件存在至少 1 分钟左右。但我不认为 java 提供这样的 API。我该如何解决这个问题?

【问题讨论】:

    标签: java xml file parsing


    【解决方案1】:

    让创建线程在创建时对文件调用 setWritable(true, true) 和 setReadable(true, true)。这将防止非创建线程在创建线程创建该文件时访问该文件。创建文件后,setWritable(true, false) 和 setReadable(true, false)。轮询线程需要在轮询时检查写入能力,以确保应该读取文件。

    或者,您可以为目录提供互斥锁。让创建文件的线程获取目录的互斥锁,创建并填充文件,然后释放互斥锁。当轮询线程需要检查时,抓取互斥体,检查目录,处理文件,然后释放互斥体。

    【讨论】:

      【解决方案2】:

      您可以将.xml文件写入该文件夹,然后再编写一个单独的控制文件。控制文件将有零字节,并具有不同的扩展名,例如 .ctl,但名称的第一部分相同。

      当轮询结果文件夹的线程找到 .ctl 文件时,它知道打开扩展名为 .xml 的同名文件是安全的。

      这种方法还有一个额外的好处,即即使在另一台计算机上进行写作任务时它也能正常工作。

      【讨论】:

        【解决方案3】:

        三种方法:

        1. 在写入文件时,名称为 foo.tmp。一旦完全写入,生产者将其重命名为foo.xml。因此,在生产者完全写入之前,消费者不会看到 XML 文件。

        2. (与@aaaa bbbb 的答案相同)。 文件foo.xml 完全写入后,将创建另一个文件(可以为空),名为foo.ctl。消费者在看到 CTL 文件之前不会处理 XML 文件,之后它可以删除两者。

        3. (与@tafoo85 的答案相同)。 在文件被生产者完全写入并使其可读之前,消费者无法读取文件。

        即使生产者线程在编写不完整的 XML 文件的过程中死亡,这些方法也能正常工作。

        【讨论】:

        • 不错的总结。当然我最喜欢你的答案2。我在重命名远程复制的文件时遇到了问题,因此我更喜欢控制文件方法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-25
        • 2013-04-08
        • 2012-04-28
        • 1970-01-01
        • 2017-04-20
        相关资源
        最近更新 更多