繁体   English   中英

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

[英]How to Wait for windows process to finish before opening file in java

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

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

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

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

谢谢

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

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

这个有点棘手。 如果你可以控制或至少与复制文件的程序进行通信,那将是一块蛋糕,但我想这不可能用于Windows。 我不得不用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);

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM