当前位置: 首页 > 面试题库 >

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

陶元凯
2023-03-14
问题内容

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

因为另一个试图打开该Java程序进行验证的Java程序不能(“文件正在被另一个进程使用”),所以将引发IOException。

有什么办法可以知道Windows何时完成复制,然后调用第二个程序从Java进行验证?

如果有人需要帮助,我会很乐意发布代码片段。

谢谢


问题答案:

这个有点棘手。如果您可以控制或至少与复制文件的程序进行通讯,那真是小菜一碟,但是我猜这在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);


 类似资料:
  • 问题内容: 我正在尝试在Node.js / Express中创建一个路由,该路由从两个查询中读取数据,然后基于来自查询的数据来增加计数。由于Node.js是异步的,因此在读取所有数据之前会显示总计。 我创建了一个简单的示例,以达到我目前正在做的事情 我不确定要等到两个功能都完成后才能打印总计,我该做什么。我是否需要创建一个自定义事件发射器来实现这一目标? 问题答案: 拥抱异步性: 或使用Promi

  • 问题内容: 我在Ruby中使用它来循环运行一系列命令行命令。然后,我需要在循环外部运行另一个命令。直到循环中的所有命令都终止后,循环外部的命令才能运行。 我如何使程序等待这种情况发生?目前,最终命令运行得太早。 一个例子: 因此,在运行之前所有需要返回的内容。 问题答案: 我认为您需要将循环内调用的结果分配给变量,并继续调用它们,直到所有变量变为真为止。 然后,您知道所有程序都已完成执行,就可以开

  • 问题内容: 有什么方法可以简单地等待所有线程处理完成?例如,假设我有: 如何更改此方法,以便该方法在注释处暂停直到所有线程的方法退出?谢谢! 问题答案: 你将所有线程放入数组中,全部启动,然后进行循环 每个连接将阻塞,直到相应的线程完成为止。线程的完成顺序可能不同于你加入线程的顺序,但这不是问题:退出循环时,所有线程均已完成。

  • 问题内容: 在我的程序执行过程中,启动了多个线程。线程数量取决于用户定义的设置,但是它们都使用不同的变量执行相同的方法。 在某些情况下,需要在执行过程中进行清理,其中一部分是停止所有线程,尽管我不希望它们立即停止,我只是设置了一个变量来检查它们是否终止。问题在于线程停止之前最多可能需要1/2秒。但是,我需要确保所有线程都已停止,然后才能继续进行清理。清理是从另一个线程执行的,因此从技术上讲,我需要

  • 问题内容: 表单在validateUsername函数之前提交时遇到问题,有机会在服务器端完成用户名检查。 仅在validateUsername函数完成后才如何提交表单?希望这很清楚… 问题答案: Olafur答案的更详细的版本-进行AJAX调用,函数无需等待就返回。 提交表单之前,回调不会结束。 您应该做的是让按钮/触发调用AJAX验证,并且回调应该提交表单而不是返回true。

  • 我对这段代码有一个问题,其中语句是在函数之前触发的,它返回0而不是正确的值。有没有办法在返回之前强制完成?我知道这是一个逻辑问题,因为如果我删除处的注释,它就可以正常工作。 如何在不使用或应用程序中的任何其他类型的超时?原始代码: 编辑代码: 这是StorageInformation类 从接口调用StorageInformation 我还尝试了r2rek的解决方案,得到了相同的结果 欢迎提出任何问