Java 当另一个线程在另一个线程创建xml文件时对其进行解析时,解析xml文件时出现过早的文件结束异常

Java 当另一个线程在另一个线程创建xml文件时对其进行解析时,解析xml文件时出现过早的文件结束异常,java,xml,file,parsing,Java,Xml,File,Parsing,我有一个java线程a,它不断轮询文件夹RESULTFOLDER并检查其中是否存在一些新文件。 现在,文件由另一台计算机上运行的其他程序发布到RESULTFOLDER中。现在发布的文件都是xml文件(仅xml)。因此,RESULTFOLDER在任何时候都只能保存xml文件。 现在,我的线程A连续轮询RESULTFOLDER,一次解析一个xml文件,然后将其删除。 有时,如果线程A试图在另一个程序发布文件A时读取并解析文件A,那么会发生这种情况。在这种情况下,我在解析文件时遇到异常。称为文件的“预

我有一个java线程a,它不断轮询文件夹RESULTFOLDER并检查其中是否存在一些新文件。
现在,文件由另一台计算机上运行的其他程序发布到RESULTFOLDER中。现在发布的文件都是xml文件(仅xml)。因此,RESULTFOLDER在任何时候都只能保存xml文件。
现在,我的线程A连续轮询RESULTFOLDER,一次解析一个xml文件,然后将其删除。
有时,如果线程A试图在另一个程序发布文件A时读取并解析文件A,那么会发生这种情况。在这种情况下,我在解析文件时遇到异常。称为文件的“预成熟结束”。
我怎样才能解决这个问题


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

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


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

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

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

这种方法的另一个好处是,即使在另一台计算机上执行写作任务,它也能正常工作。

三种方法:

  • 在写入文件时,is的名称为
    foo.tmp
    。完成编写后,制作人将其重命名为
    foo.xml
    。因此,在生产者完全编写XML文件之前,使用者不会看到XML文件

  • (答案与@aaaa bbbb相同)。 一旦文件
    foo.xml
    被完全写入,就会创建另一个名为
    foo.ctl
    的文件(可以为空)。使用者在看到CTL文件之前不会处理XML文件,然后可以删除这两个文件

  • (答案与@tafoo85相同)。 只有在文件被生产者完全写入并可读之前,使用者才能读取该文件


  • 这些方法有助于正确地工作,即使生产者线程在写入一个不完整的XML文件时死亡,

    良好的摘要。当然我最喜欢你的答案。我在重命名远程复制的文件时遇到问题,所以我更喜欢控制文件方法。