我有一个java线程A,它不断轮询文件夹RESULTFOLDER并检查其中是否有新文件。
现在,文件由另一台机器上运行的其他程序发布到RESULTFOLDER。现在发布的文件都是xml文件(只有xml)。所以在任何时候RESULTFOLDEr都只能保存xml文件。
现在我的线程A不断轮询RESULTFOLDER并一次解析一个xml文件,然后删除它。
现在有时发生的事情是,如果线程A在其他程序发布文件A时尝试读取并解析文件A.在这种情况下,我在解析文件时遇到异常。文件的预成熟结束。
我该如何解决这个问题?
我认为的一种方法是检查文件创建的日期时间,并确保文件至少保存1分钟左右。但我不认为java提供了这样的API。我怎样才能解决这个问题?
答案 0 :(得分:3)
您可以将.xml文件写入该文件夹,然后编写一个单独的控制文件。控制文件将具有零字节,并具有不同的扩展名,例如.ctl,但名称的第一部分将相同。
当轮询结果文件夹的线程找到.ctl文件时,它知道打开带有.xml扩展名的同名文件是安全的。
这种方法的另一个好处是即使写作任务在另一台计算机上也能正常工作。
答案 1 :(得分:1)
在创建时让创建线程在文件上调用setWritable(true,true)和setReadable(true,true)。这将防止非创建线程在创建线程创建时访问该文件。创建文件后,setWritable(true,false)和setReadable(true,false)。轮询线程需要在轮询时检查写入能力,以确保应该从中读取文件。
或者,您可以为目录提供互斥锁。让创建文件的线程获取目录的互斥锁,创建并填充文件,然后释放互斥锁。当轮询线程需要进行检查时,抓取互斥锁,检查目录,处理文件,然后释放互斥锁。
答案 2 :(得分:0)
三种方法:
正在编写文件时,其名称为foo.tmp
。完成编写后,生产者将其重命名为foo.xml
。因此,在生产者完全写入之前,消费者不会看到XML文件。
(与@aaaa bbbb相同的答案)。
完全写入文件foo.xml
后,将创建另一个名为foo.ctl
的文件(可以为空)。消费者在看到CTL文件之前不处理XML文件,之后它可以删除它们。
(与@ tafoo85相同的答案)。 消费者无法阅读文件,直到生产者写完并使其可读。
即使生成器线程在编写不完整的XML文件的过程中死亡,这些方法也可以正常工作。