我实现了JNotify以确定新文件何时到达特定目录,并且当文件到达时,将文件名发送到另一个函数,如下所示:
public class FileDetector {
MessageProcessor mp;
class Listener implements JNotifyListener {
public void fileCreated(int wd, String rootPath, String name) {
print("created " + rootPath + " : " + name);
mp.processMessage(rootPath + "\\" + name);
}
}
}
函数mp.processMessage尝试打开文件,但是我一直收到另一个进程正在使用该文件的错误。但是,由于刚刚创建了文件,因此唯一可能正在使用它的其他进程是JNotify。
我放了几个print语句,似乎在侦听器的print函数之前调用了函数mp.processMessage。除了将整个消息处理放在监听器类中之外,有没有人建议我如何解决这个问题?
答案 0 :(得分:1)
答案 1 :(得分:0)
这是我到目前为止所做的 - 在尝试打开文件之前,我在mp.processMessage()
加了100毫秒的延迟,并且没有遇到任何问题。但是,我仍然感到困惑的是为什么这是必要的,以及是否有更好的解决方案来解决这个问题。
答案 2 :(得分:0)
我试过这个,发现任意延迟对我来说效果不好。我做的是创建一个DelayQueue。我将每个观察到的新文件添加到队列中,延迟时间为100毫秒。当延迟到期时,我检查了文件是否可读/可写。如果是,我从队列中弹出它。如果没有,我将其重新读入队列,延迟100ms。要检查它是否可读/可写,我尝试打开文件的FileInputStream。如果没有异常,我关闭流并弹出文件。
我希望nio.2(jsr 203)没有同样的问题。如果你可以使用Java 7,你可能想尝试一下。