JNotify和File Reader相互冲突

时间:2011-07-08 02:58:40

标签: java jnotify

我实现了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。除了将整个消息处理放在监听器类中之外,有没有人建议我如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

@Eile我的想法是,只要一个进程正在复制文件,您就是在尝试读取它,100毫秒延迟将完成复制,然后您就可以轻松读取该文件了。

答案 1 :(得分:0)

这是我到目前为止所做的 - 在尝试打开文件之前,我在mp.processMessage()加了100毫秒的延迟,并且没有遇到任何问题。但是,我仍然感到困惑的是为什么这是必要的,以及是否有更好的解决方案来解决这个问题。

答案 2 :(得分:0)

我试过这个,发现任意延迟对我来说效果不好。我做的是创建一个DelayQueue。我将每个观察到的新文件添加到队列中,延迟时间为100毫秒。当延迟到期时,我检查了文件是否可读/可写。如果是,我从队列中弹出它。如果没有,我将其重新读入队列,延迟100ms。要检查它是否可读/可写,我尝试打开文件的FileInputStream。如果没有异常,我关闭流并弹出文件。

我希望nio.2(jsr 203)没有同样的问题。如果你可以使用Java 7,你可能想尝试一下。