Java "tail -f" обертка - PullRequest
       15

Java "tail -f" обертка

3 голосов
/ 12 июня 2009

Мне нужно обернуть команду Unix "tail -f" в BufferedInputStream. Я не хочу имитировать или имитировать хвост, как указано этим вопросом . Скорее, я хочу использовать хвост, ожидая, пока он даст мне новую строку.

Ответы [ 6 ]

14 голосов
/ 12 июня 2009

Лучше всего использовать класс 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() должен блокироваться, так как он ожидает большего ввода от входного потока, так что вы не будете заняты ожиданием при поступлении данных.

1 голос
/ 12 июня 2009

проверьте также ProcessBuilder :

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

, где file - это строка типа "/var/log/messages".

1 голос
/ 12 июня 2009

Посмотрите на Runtime.exec (строковая команда). Возвращает объект Process , который имеет потоки ввода и вывода.

0 голосов
/ 30 марта 2011
0 голосов
/ 12 июня 2009

Если у вас есть команда unix

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

Тогда хвост будет выглядеть как InputStream, который может блокироваться в течение определенного периода времени. Если вы не хотите блокировать себя, вы должны использовать пакеты nio. Я считаю, что большинство других способов доступа к хвостовой команде (например, Process) приводят к аналогичному InputStream.

0 голосов
/ 12 июня 2009

Я предполагаю, что подходы system () и popen () не будут работать, поскольку они будут блокировать вашу программу до тех пор, пока команда tail не завершится.

Я думаю, вы могли бы перенаправить вывод в файл и использовать 'diff' для последней версии, чтобы увидеть, какие строки новые?

...