Java “tail -f” wrapper

2019-03-31 05:38发布

I need to wrap the Unix command "tail -f" in a BufferedInputStream. I don't want to simulate or mimic tail as stated by this question. Rather, I want to use tail, waiting for it to give me a new line.

标签: java unix tail
6条回答
\"骚年 ilove
2楼-- · 2019-03-31 06:00

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".

查看更多
欢心
3楼-- · 2019-03-31 06:01

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.

查看更多
一夜七次
4楼-- · 2019-03-31 06:02

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?

查看更多
Lonely孤独者°
5楼-- · 2019-03-31 06:08

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

查看更多
在下西门庆
6楼-- · 2019-03-31 06:17

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.

查看更多
登录 后发表回答