Java “tail -f” wrapper

断了今生、忘了曾经 提交于 2019-12-03 20:18:56

Your best bet is to use the Process class and read with a 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() should block as it's waiting for more input from the input stream, so you will not be busy-waiting as data comes in.

Look at Runtime.exec(String command). Returns a Process object that has Input and Output Streams.

check also ProcessBuilder:

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

where file is String like "/var/log/messages".

I am guessing that system() and popen() type approaches will not work as they will block your program until the tail command terminates.

I think you could redirect the output to a file and use 'diff' against the last version to see which lines are new?

If you have the unix command

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

Then the tail would appear as an InputStream that may block for a period of time. If you don't want to block yourself, you would use the nio packages. I believe that most other ways to access the tail command (such as Process) results in a similar InputStream.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!