2

我实现了 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。

我放了几个打印语句,似乎函数 mp.processMessage 在侦听器的打印函数之前被调用。除了将整个消息处理放在侦听器类中之外,有没有人对我如何解决这个问题提出建议?

4

3 回答 3

1

@Eile我的想法是,一旦一个进程正在复制文件,您就尝试读取它,100 ms 延迟将首先完成复制 n 然后您可以轻松读取文件。

于 2012-02-02T09:40:42.120 回答
0

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

于 2011-07-11T12:50:14.127 回答
0

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

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

于 2011-08-22T11:22:30.210 回答