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 だけです。

いくつかの print ステートメントを入れたところ、関数 mp.processMessage がリスナーの print 関数の前に呼び出されているように見えます。メッセージ処理全体をリスナークラス内に配置する以外に、これを解決する方法について誰か提案がありますか?

4

3 に答える 3

1

@Eile私が思うのは、1つのプロセスがファイルをコピーするとすぐに、それを読み取ろうとすると、100ミリ秒の遅延で最初にコピーが完了し、ファイルを簡単に読み取ることができるということです。

于 2012-02-02T09:40:42.120 に答える
0

これまでに行ったことは次のとおりmp.processMessage()です。ファイルを開こうとする前に100ミリ秒の遅延を追加しましたが、問題はありませんでした。しかし、なぜそれが必要なのか、また、この問題に対するより良い解決策があるかどうかについて、私はまだ困惑しています。

于 2011-07-11T12:50:14.127 に答える
0

これを試してみたところ、任意の遅延がうまく機能しないことがわかりました。私がしたことは、DelayQueue を作成することでした。観測された各新しいファイルを 100 ミリ秒の遅延でキューに追加しました。遅延が期限切れになったとき、ファイルが読み取り/書き込み可能かどうかを確認しました。ある場合は、キューからポップしました。そうでない場合は、さらに 100 ミリ秒遅れてキューに再追加しました。読み取り/書き込み可能かどうかを確認するために、ファイルへの FileInputStream を開こうとします。例外がなければ、ストリームを閉じてファイルをポップします。

nio.2 (jsr 203) に同じ問題がないことを願っています。Java 7 を使用できる場合は、試してみてください。

于 2011-08-22T11:22:30.210 に答える