4

特定のディレクトリで新しいファイルを受信した場合に通知するリスナーを実装しました。これは、TimerTaskをポーリングして使用することで実装されます。これで、プログラムは、新しいファイルを受信すると、ファイルを開いてそれが正しいファイルであるかどうかを検証する別のJavaプログラムを呼び出すように設定されました。私の問題は、ポーリングが指定された秒数後に行われるため、ファイルがそのディレクトリにコピーされ、ウィンドウによってロックされる場合が発生する可能性があることです。

検証のためにそれを開こうとする他のJavaプログラムはIOExceptionをスローできません(「ファイルは別のプロセスによって使用されています」)。

Windowsがいつコピーを終了したかを知り、2番目のプログラムを呼び出してJavaから検証を行う方法はありますか?

誰かが助けるためにコードスニペットを必要とするなら、私は喜んでコードスニペットを投稿します。

ありがとう

4

3 に答える 3

5

すべての助けに感謝します、私はWatchEventで同じ問題を抱えていました。残念ながら、あなたが言ったように、ファイルがまだWindowsによってロックされている場合でも、file.canRead()とfile.canWrite()は両方ともtrueを返します。そのため、同じ名前で「名前を変更」しようとすると、Windowsが機能しているかどうかがわかります。だからこれは私がしたことです:

    while(!sourceFile.renameTo(sourceFile)) {
        // Cannot read from file, windows still working on it.
        Thread.sleep(10);
    }
于 2013-03-20T20:47:17.393 に答える
3

これは少し注意が必要です。ファイルをコピーするプログラムを制御したり、少なくとも通信したりできれば、それは簡単なことでしたが、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);
于 2011-11-30T23:40:38.160 に答える
0

Fileオブジェクトを作成してから、またはファイルを他のJavaプログラムで使用できるかどうかを知るcanReadことができると思います。canWrite

http://docs.oracle.com/javase/6/docs/api/java/io/File.html

他のオプションは、最初のプログラムでファイルを開こうとし、例外がスローされた場合は、他のJavaプログラムを呼び出さないことです。ただし、上記のオプションをお勧めし'Fileます。

于 2011-11-30T23:40:04.230 に答える