3

Unix コマンド「tail -f」を BufferedInputStream にラップする必要があります。この質問で述べられているように、テールをシミュレートまたは模倣したくありません。むしろ、新しい行が表示されるのを待って、tail を使用したいと思います。

4

6 に答える 6

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()入力ストリームからの追加の入力を待っているときにブロックする必要があるため、データが入ってくるときにビジー待機することはありません.

于 2009-06-12T18:55:07.883 に答える
1

ProcessBuilderも確認してください:

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

file「/var/log/messages」のような文字列です。

于 2009-06-12T19:44:26.330 に答える
0

さらに 2 つの本格的なプロジェクト:

http://www.eclipse.org/tptp/home/documents/tutorials/gla/gettingstarted_gla.html

http://commons.apache.org/io/api-release/org/apache/commons/io/input/Tailer.html

于 2011-03-30T09:26:41.720 に答える
0

system() および popen() タイプのアプローチは、tail コマンドが終了するまでプログラムをブロックするため、機能しないと推測しています。

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

于 2009-06-12T18:49:15.777 に答える
0

unix コマンドがある場合

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

その後、尾はInputStream一定期間ブロックする可能性のある として表示されます。自分自身をブロックしたくない場合は、nio パッケージを使用します。tail コマンド ( などProcess) にアクセスする他のほとんどの方法は、同様の結果になると思いますInputStream

于 2009-06-12T18:51:09.657 に答える