ファイルが追加されたか、完全に変更されたかをプログラムが判断するための最良の方法を考えています。
私が現在行っているのは、ファイルが追加されたかどうかを確認するために FileInputStream.avail を使用している、私が書いた LogIOThread を使用することです。もしそうなら、私は編集不可能な JTextArea (実際には、可変スクロール機能を持つ変更された JTextArea) に追加しています。私のエンドゲームは、基本的にlog4j出力ログファイルをスクロールする自動スクロールJTextAreaを持つことでした。これは今私にとってうまくいっています。これをログ以外のファイルに適用したいと思います。
LogIOThread に追加したいのは、新しいテキストが追加されるだけでなく、ファイルの内容が変更されたかどうかを確認するモニターです。私が解決しようとしている最初のユースケースは、実行中にファイルが書き換えられることです。最も基本的なレベルでは、この関数を使用して JTextArea をリロードし、FileInputStream を閉じて再度開き、ファイルが上書きされた場合は最初からやり直すことができると考えました。
プロパティ ファイルの変更など、中間ファイル挿入の 2 番目のユース ケースを処理するために、より堅牢にしたいのではないかと考えました。行が変更されたかどうかがわかれば、textArea に行の置換を実行させることができると考えました。
Java6 を使用する必要がある (私が設定したものではない) ため、新しい nio FileWatcher の一部は私には適していません。私はFileInputStream経由で追加をキャッチしているので、通知機能は一般的に逆効果のようです。これにより、Commons や jnotify などの他のライブラリを軽視するようになりました。私は間違っているかもしれませんが、おそらく FileInputStream.avail は私にとって最善の方法ではありません。
私が最初に考えたのは、ファイル サイズを保存し、それが大幅に変化したかどうか (保存された値よりも小さい値に変化したかどうか) を確認できるということでした。新しく作成されたログ ファイルには新しい textArea が必要になるため、これは悪くないようで、私の最初のユース ケースを解決します。これは、ファイル内の特定の値を変更する 2 番目のユース ケースでは機能しません。また、IOThread がスリープしている間に一定のサイズで再作成されるファイルに問題がある可能性もありますが、その可能性は低いと思います。
2 番目に考えたのは、ファイルの変更時刻を継続的にチェックでき、追加可能なテキストがない場合は、ファイルを読み直して行比較を行うということでした。毎回リロードしない限り、textArea の行を変更する場合は、とにかくこれを行う必要があります。ただし、これは恐ろしく非効率的です。
助言がありますか?新しいテキストを取得する提案があり、avail + ファイル変更チェック コンボよりも優れたものに変更するという提案がある場合、LogIOThread の動作を変更することに反対しているわけではありません。