Unix コマンド「tail -f」を BufferedInputStream にラップする必要があります。この質問で述べられているように、テールをシミュレートまたは模倣したくありません。むしろ、新しい行が表示されるのを待って、tail を使用したいと思います。
6 に答える
あなたの最善の策は、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も確認してください:
Process tail = new ProcessBuilder("tail", "-f", file).start();
BufferedInputStream bis = new BufferedInputStream(tail.getInputStream())
file
「/var/log/messages」のような文字列です。
さらに 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
system() および popen() タイプのアプローチは、tail コマンドが終了するまでプログラムをブロックするため、機能しないと推測しています。
出力をファイルにリダイレクトし、最後のバージョンに対して「diff」を使用して、どの行が新しいかを確認できると思いますか?
unix コマンドがある場合
tail -f <file> | <some java program>
その後、尾はInputStream
一定期間ブロックする可能性のある として表示されます。自分自身をブロックしたくない場合は、nio パッケージを使用します。tail コマンド ( などProcess
) にアクセスする他のほとんどの方法は、同様の結果になると思いますInputStream
。