2016-05-25 6 views
0

私はいくつかの同様の質問を読んだtail -f somefileJavaファイルのテイラー実装

と同等ですjavaファイルウォッチャーを実装します。私はいくつかのオプションを見てきました。

  1. BufferedReaderを使用して、基本的な考え方は、ファイルから読み取るためにバッファードリーダーを使用することです。 nullが返された場合は、数秒間スリープしてから無限ループを続行します。私はこれを少し試してみましたが、私の結果はあなたがファイルの最後まで読んでいる限り、getLineメソッドはもはやあなたに更新を提供しません。このアプローチはまったく機能しますか?

  2. random access fileを使用します。読み込み操作を行うたびにランダムアクセスファイルを作成し、現在のファイルが長ければファイル長を履歴ファイルと比較し、最後にデルタ部分の読み込みと読み込みを行います。私はこれがうまくいくと確信していますが、新しいランダムアクセスファイルを毎回読み込んで開くと、より効率的なアプローチはありませんか?

  3. 新しいJDKがバッファ付きファイルリーダーにstream APIを追加したのを見たことがあります。これは、末尾に追加された新しいコンテンツとは関係ありません。それは最初に与えられたものにのみ関連しています。私の質問は、このストリームのAPIは、tailer functionを考慮に入れて拡張することができますか?

質問:

  • BufferedReadertail -fを実装するために使用することができますか?私の場合、一度EOFを読むと、nullだけが返されます。

  • tail -fの実装にJDK8 streamを使用できますか?

  • さらに効率的な実装ではなく、apache common libのようなファイルを繰り返し開いて開くのですか?

+0

1と3がおそらく最も簡単で、本当にそれはあなたの選択です。なぜあなたはすべての人のための実装を見たことがありますか?最も魅力的なものを選んでください。個人的に私はグルーヴィーでそれをやった。 def text = new File( "tailFile.txt").text.split()などのファイル全体を読む - あなたが望む "text"から任意の行を選ぶことができます。非常にシンプルで、私は今までにメモリが足りなくなったら書き直します(これまでのところ、私は10GBのファイルをテーリングしていないからです) –

+0

ps、あなたの質問はコマンドとして表現されています。選択肢の1つを選択するか、実装全体を教えてもらえますか? –

+0

オプション1/3で述べたように@BillKは全く動作しますか?私の場合は、最後まで読み込んだ後、全く新しいコンテンツは返されません。 – zinking

答えて

-1

私はしばらく前にこれをしなかったし、私の経験から、私はあなたの質問は無意味であり得ることを推測するだろう - 読み込みの間でファイルをクローズした方がよいか、誰かが私からの提案としてApacheテイラークラスを使用する場合があります同様の質問:それはあなたがリフレッシュするのに役立ちますが、それはあなたがそれを読んでいる間、ロックされてから、ファイルを保持しますので、これだけではなく、助け

How can I follow a file like "Tail -f" does in Java without holding the file open (Prevent rename/delete)

(私の環境で承認取得ソフトウェアが困難であるため)、私はそれを使用しないでしまった - 代わりに、私はこのようなプロセスを使用することにしました:非常によく

Detect Change 
Open file 
Seek to previous position 
Read to end of file 
Remember position for next seek 
Close 

このプリフォームをし、かなりの数の問題を解決 - 私は今、それをしばらく使っています。

リンクされた質問の誰かが、java.nio.file.WatchService.poll()を使用して変更が検出されたことを示唆しましたが、ファイルサイズを繰り返し読み取っています。

#2のopen/seek/closeメソッドについて言及しました。オープン/テール/クローズの部分は、ファイルの更新を待つのに比べて非常に時間がかかるため、パフォーマンスは心配しないでください。より効率的にするには、ファイルサイズのテストの間隔を長くします。この方法では一度に多くの行をチャンクしますが、あまり頻繁にファイルを読むことはありません。

私のコードを見直すと、位置設定メソッドを持つFileChannel(FileInputStream.getChannel())を使用してしまいました。

0

最終的にこれを解決するためにいくつかのApacheライブラリを使用しました。 (私がそれを覚えていれば更新されます)。

本質的にファイルウォッチャーは、ファイルシステムのAPIに依存します。 Linuxディストリビューションでは、EOFを読んでも大丈夫で、後で追加される新しい内容を持ってくるでしょう。

私が観察した問題はMACOであり、EOFの後にファイルハンドラが有効ではなくなった後で読むことができます。新しいコンテンツを読んでいることがわかっている場合は、ファイルを再度開く必要があります。

  • これはMacOSのMaveriksで、私はまだ最新バージョンでは同じであることをテストしませんでした。
  • また、これはJDK APIに基づいており、基盤となるMACOSファイルシステムAPIに基づいていません。私はless /Ftail -fがより効率的に実装されているはずだと感じたからです。