2009-06-12 23 views
3

私は、Unixコマンド "tail -f"をBufferedInputStreamにラップする必要があります。私はthis questionで述べたように、模擬したり模倣したりしたくありません。むしろ、私は新しい行を与えるのを待って、尾を使用したい。Java "tail -f" wrapper

答えて

14

あなたの最善の策はProcessクラスを使用して読むことですScanner

Runtime r = Runtime.getRuntime() 
Process p = r.exec("tail -f") 
Scanner s = new Scanner(p.getInputStream()) 
while (s.hasNextLine()) { 
    String line = s.nextLine() 
    // Do whatever you want with the output. 
} 

hasNextLine()あなたがデータとして多忙待ちをされませんので、それは入力ストリームからの複数の入力を待っていてブロックする必要があります入って来またProcessBuilder

+0

ありがとう!それはとてもうまくいく。 – geowa4

+1

唯一の問題は、最後に改行文字が必要であることです – geowa4

1

Runtime.exec(Stringコマンド)を見てください。 入力ストリームと出力ストリームを持つプロセスオブジェクトを返します。

+0

これは私が探しているもののように思えます。私はこれを試しています、ありがとう。 – geowa4

+0

問題ありません、それをupvoteに気軽に;) – Gandalf

0

私は、tailコマンドが終了するまでプログラムがブロックされるため、system()とpopen()型のアプローチは動作しないと推測しています。

出力をファイルにリダイレクトし、最後のバージョンに対して 'diff'を使用して、新しい行を確認することはできますか?

0

あなたは

tail -f <file> | <some java program> 

は、その後、尾はしばらくの間ブロックすることがありInputStreamとして現れるUNIXコマンドを使用している場合。あなた自身をブロックしたくない場合は、nioパッケージを使用します。 tailコマンドにアクセスする他のほとんどの方法(Processなど)の結果は、同様のInputStreamになると私は信じています。

1

チェック:。

Process tail = new ProcessBuilder("tail", "-f", file).start(); 
BufferedInputStream bis = new BufferedInputStream(tail.getInputStream()) 

は、は "/ var/log/messages"のような文字列です。

関連する問題