2009-06-12 4 views
3

Мне нужно обернуть команду Unix «tail -f» в BufferedInputStream. Я не хочу имитировать или имитировать хвост, как указано this question. Скорее, я хочу использовать хвост, ожидая его, чтобы дать мне новую линию.Java "tail -f" wrapper

ответ

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

+0

Спасибо! Он работает очень хорошо. – geowa4

+1

Единственная проблема заключается в том, что в конце требуется новый символ строки – geowa4

1

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

+0

Это похоже на то, что я ищу. Я попробую это, спасибо. – geowa4

+0

Нет проблем, не стесняйтесь повышать его;) – Gandalf

0

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

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

0

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

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

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

1

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

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

где file - это строка, называемая «/ var/log/messages».