Мне нужно обернуть команду Unix «tail -f» в BufferedInputStream. Я не хочу имитировать или имитировать хвост, как указано this question. Скорее, я хочу использовать хвост, ожидая его, чтобы дать мне новую линию.Java "tail -f" wrapper
ответ
Лучше всего использовать 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()
должен блокировать, как он ждет дополнительного ввода из входного потока, так что вы не будете занят ожидающим как данные приходит в
Я предполагаю, что подходы типа system() и popen() не будут работать, поскольку они заблокируют вашу программу до тех пор, пока команда tail не завершится.
Я думаю, вы можете перенаправить вывод в файл и использовать «diff» для последней версии, чтобы увидеть, какие строки являются новыми?
Если у вас есть команда Unix
tail -f <file> | <some java program>
Тогда хвост будет выглядеть как InputStream
, которые могут блокировать в течение определенного периода времени. Если вы не хотите блокировать себя, вы должны использовать nio-пакеты. Я считаю, что большинство других способов доступа к команде хвоста (например, Process
) приводит к аналогичному InputStream
.
проверка также ProcessBuilder:.
Process tail = new ProcessBuilder("tail", "-f", file).start();
BufferedInputStream bis = new BufferedInputStream(tail.getInputStream())
где file
- это строка, называемая «/ var/log/messages».
Спасибо! Он работает очень хорошо. – geowa4
Единственная проблема заключается в том, что в конце требуется новый символ строки – geowa4