如何在java中打开文件之前等待windows进程完成

我有一个实现了一个监听器,通知我们是否在特定目录中收到一个新文件。 这是通过轮询和使用TimerTask实现的。 现在程序已设置好,一旦收到新文件,它就会调用另一个打开文件的java程序,并validation它是否是正确的文件。 我的问题是,由于轮询在指定的秒数后发生,可能会出现在该目录中复制文件并因此被Windows锁定的情况。

这会引发IOException,因为尝试打开它进行validation的其他java程序不能(“File正被另一个进程使用”)。

有没有办法让我知道Windows何时完成复制,然后调用第二个程序从java进行validation?

如果有人需要它们以帮助我,我将非常乐意发布代码片段。

谢谢

这个有点棘手。 如果你可以控制或至少与复制文件的程序进行通信,那将是一块蛋糕,但我认为这是不可能的。 我不得不在不久前用SFU软件处理类似的问题,我通过循环尝试打开文件进行写入直到它变得可用来解决它。

为了避免循环时CPU使用率过高,可以以指数分布速率检查文件。

编辑可能的解决方案:

File fileToCopy = File(String pathname); int sleepTime = 1000; // Sleep 1 second while(!fileToCopy .canWrite()){ // Cannot write to file, windows still working on it Sleep(sleepTime); sleepTime *= 2; // Multiply sleep time by 2 (not really exponential but will do the trick) if(sleepTime > 30000){ // Set a maximum sleep time to ensure we are not sleeping forever :) sleepTime = 30000; } } // Here, we have access to the file, go process it processFile(fileToCopy); 

非常感谢所有的帮助,我遇到了与WatchEvent相同的问题。 不幸的是,正如你所说,file.canRead()和file.canWrite()都返回true,即使文件仍被Windows锁定。 所以我发现如果我尝试用同一个名称“重命名”它,我知道Windows是否正在使用它。 所以这就是我做的:

  while(!sourceFile.renameTo(sourceFile)) { // Cannot read from file, windows still working on it. Thread.sleep(10); } 

我认为您可以创建File对象,然后使用canReadcanWrite来了解文件是否可以被其他java程序使用。

http://docs.oracle.com/javase/6/docs/api/java/io/File.html

其他选项是尝试在第一个程序上打开文件,如果它抛出exception,则不要调用其他java程序。 但我会推荐上面的'File选项。