より詳細な回答を編集します。
問題は ...
あなたが書いた:
このファイルを検出したときにシステム時間から取得した FileObject の作成時間と fileCreatedTime フィールドでソートされます:
....
thread_1 は、作成された新しいファイルを検出するためのハードディスクのリスナーです。Java 7 では WatchService API を使用しています。別のプログラムによって新しいファイルが作成された場合。... thread_1 はそれを検出して取得し、それを PriorityBlockingQueue ex に入れます:
- 作成時間と「ファイル書き込み終了時間」は大きく異なる場合があります。(ファイルサイズにもよります)。
例えば:
ファイルマネージャーを開きます。約 60 mb のファイルのダウンロードを開始します。作成時間に注意してください。約3分後、最終時間を見てください。
新しいファイルを検出するために、作成時間を確認するのは、 「それを PriorityBlockingQueue ex に入れる」のは間違った瞬間です:
thraed_1 は、ファイルの書き込みが完了するまで待たなければなりません。そして、それを「PriorityBlockingQueue ex :」に入れることができます。
ファイルへの書き込みが完了したことを検出するにはどうすればよいですか?
3 あまり複雑ではないオプション
- a.) ファイルが作成され、ファイルの準備ができた時間を比較します。
また
- b.) ファイルのサイズが着実に増加していることを確認します。ファイルが終了すると、成長が止まります。
また
- c.) 一時フォルダーに移動してみてください。
あなたは何を好みますか?
私は解決策cを好むでしょう。
書き込み用に開かれたファイルは移動できません。サードパーティのプログラムがファイルを閉じた後、ファイルを移動できます。
必要な手順。
- thread_1 は、サードパーティ プログラムによって作成されたファイルを監視しています。
- thread_1 が xyztmp フォルダーに移動しようとしています (10 または 20 または ... 秒ごと)。
- thread_1 は xyztmp フォルダーで新しい着信ファイルを探し、それを PriorityBlockingQueue ex に入れます。
解決策 b. はもっと複雑です。
thread_1 は、着信ファイル名とサイズを制御配列に入れて、3 ~ 5 回 (5 秒以上ごとに) 比較します。
配列
(filenamexyz.dat, size1, size2, size3, ...).
(filenameabc.dat, size1, size2, size3, ...).
(filenamefgh.dat, size1, size2, size3, ...).
....
5 つの比較サイズごとに名前で識別されるファイルが同じ場合、サードパーティ プログラムはこのファイルへの書き込みを完了しています。
これで PriorityBlockingQueue に入れることができます ex:
順を追って見ていきましょう
list.size が 2 のときに thread_2 が開始されたと仮定します。
- サードパーティ プログラムがファイルを 1 つずつ書き込み始めます。
- サードパーティ プログラムが FILE_1 の書き込みを開始します。
- thread_1 は、作成された FILE_1 を検出し、リストに入れます。
- サードパーティ プログラムが FILE_1 の書き込みを終了しました。
- サードパーティ プログラムが FILE_2 の書き込みを開始します。
- thread_1 は、作成された FILE_2 を検出し、リストに入れます。
- if (priorityBlockingQueue.size) > 1) TRUE
- thread_2 は、リスト FILE_1 の最初のファイルの読み取りと処理から開始します。
- サードパーティ プログラムが FILE_2 の書き込みを終了しました。
- サードパーティ プログラムが FILE_3 の書き込みを開始します。
- thread_1 は、作成された FILE_3 を検出し、リストに入れます。
- thread_2 が FILE_1 の処理を終了しました。
- thread_2 は、リスト FILE_2 内の次のファイルから開始します。
- サードパーティ プログラムが FILE_4 の書き込みを終了しました。
- サードパーティ プログラムが FILE_5 の書き込みを開始します。(FILE_5 は FILE_4 より大きい)。
- thread_1 は、作成された FILE_5 を検出し、リストに入れます。
- thread_2 が FILE_3 の処理を終了しました。
- thread_2 は、リスト FILE_4 内の次のファイルから開始します。
- thread_2 が FILE_4 の処理を終了しました。
- thread_2 は、リスト FILE_5 内の次のファイルから開始します。
- thread_2 は FILE_5 の処理を終了しました。
- サードパーティ プログラムが FILE_5 の書き込みを終了しました。
サードパーティのプログラムが書き込むファイルが大きく、書き込みに時間がかかり、thread_2 が小さい FILE_4 の読み取りを終了した場合。
thread_2 は、ファイルが読み取り可能かどうかに関係なく、リストから次のファイル FILE_5 を取得します。
FILE_5 は、サードパーティ プログラムがまだ書き込みを行っているファイルです。FILE_5 は、thread_2 が読み取って処理しているファイルです。thread_2が読み取ったバイト数は、この時点でサードパーティ プログラムが書き込んだバイト数のみです。