如何创建和编写文件一个Java进程并从另一个进程读取而不会遇到读/写问题(Java / EE)

时间:2010-12-03 22:10:42

标签: java multithreading file file-io process

我的情况

我有一个进行FTP的过程和另一个发送电子邮件的过程。

当我完成FTP时,我想通过电子邮件发送成功通知。 因此,电子邮件进程正在监视新文件pr配置文件以进入特定目录

FTP进程创建一个适合电子邮件进程的文件,该文件或多或少是属性文件中的电子邮件列表。

我面临的问题是我创建文件并编写它。电子邮件进程,用于检测新文件并在写入文件之前或之后读取该文件。因此它只访问空参数。虽然我可以在电子邮件处理过程中进行睡眠,但它并不适用于所有情况,并且会阻碍已完成文件的其他人。

我可以使用什么? - 创建一个无法读取的属性文件,直到完全写入 - 或者创建一个带锁的属性文件,如果需要,可以从另一个进程解锁。

我的选择是什么?

目前: - 我尝试过使用apache commons配置setProperty它创建了相同的旧读/写访问问题 - 我创建了一个property = new属性并使用store方法来创建文件。即使这样,电子邮件流程也会在完全

之前阅读

仅供参考:电子邮件流程具有WatchDirectory,并在创建新文件时读取。

2 个答案:

答案 0 :(得分:5)

您需要对文件系统执行“原子”操作。将文件写入另一个文件名(例如.tmpfoobar),当您完成后,关闭它并执行File.renameTo()将其移动到位。重命名是原子的。

答案 1 :(得分:0)

不确定为什么你被投票,因为这似乎是一个值得讨论的问题。

Martin建议使用文件重命名来完成此操作:首先使用临时名称编写文件,然后重命名它。然后,如果其他进程/线程只访问重命名的文件,那么你应该很好,因为重命名确实是原子的。

如果使用多线程应用程序,另一种方法是使用某种互斥锁来确保在写入线程关闭文件之前读取线程不会读取。

此页面和javamex.com上的其他人对Java并发编程有一些非常好的解释:

http://www.javamex.com/tutorials/synchronization_concurrency_1.shtml