【发布时间】:2011-03-23 02:44:21
【问题描述】:
我一直在编写一个监视目录的程序,当在其中创建文件时,它会更改名称并将它们移动到新目录。在我的第一个实现中,我使用了 Java 的 Watch Service API,它在我测试 1kb 文件时运行良好。出现的问题是,实际上创建的文件大小在 50-300mb 之间。发生这种情况时,观察者 API 会立即找到该文件,但无法移动它,因为它仍在写入中。我尝试将观察者置于一个循环中(在可以移动文件之前会产生异常),但这似乎效率很低。
由于这不起作用,我尝试使用一个计时器,该计时器每 10 秒检查一次文件夹,然后尽可能移动文件。这是我最终采用的方法。
问题:在没有进行异常检查或不断比较大小的情况下,是否会在文件写入完成时发出信号?我喜欢对每个文件只使用一次 Watcher API 的想法,而不是不断地使用计时器检查(并遇到异常)。
非常感谢所有回复!
nt
【问题讨论】:
-
I tried putting the watcher in a loop (which generated exceptions until the file could be moved) but this seemed pretty inefficient.是的,这是一个糟糕的解决方案。管理控制流不例外。 -
可悲的是@ntmp,从我到目前为止的测试来看,寻找异常是判断操作系统仍在“写入”或“复制”文件的最佳方式。但我同意@Sean Patrick Floyd 的观点,这是一种让它发挥作用的糟糕方法。我个人希望检查是 java.io.File API 的一部分。不知道为什么没有。将留给 JVM 人员来实现并使我们的开发人员更容易......
-
“检查异常”方法甚至不适用于 UNIX,因为 UNIX 文件系统不会锁定正在写入的文件。在 UNIX 上,java 会愉快地移动部分写入的文件,从而导致数据损坏。