【发布时间】:2010-11-02 13:34:36
【问题描述】:
我需要将 Unix 命令“tail -f”包装在 BufferedInputStream 中。我不想像this question 所说的那样模拟或模仿尾巴。相反,我想使用tail,等待它给我一个新行。
【问题讨论】:
我需要将 Unix 命令“tail -f”包装在 BufferedInputStream 中。我不想像this question 所说的那样模拟或模仿尾巴。相反,我想使用tail,等待它给我一个新行。
【问题讨论】:
最好的办法是使用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() 应该阻塞,因为它正在等待来自输入流的更多输入,因此您不会在数据进入时忙于等待。
【讨论】:
查看 Runtime.exec(String command)。返回具有输入和输出流的 Process 对象。
【讨论】:
还要检查ProcessBuilder:
Process tail = new ProcessBuilder("tail", "-f", file).start();
BufferedInputStream bis = new BufferedInputStream(tail.getInputStream())
其中file 是类似“/var/log/messages”的字符串。
【讨论】:
我猜 system() 和 popen() 类型的方法不会起作用,因为它们会阻塞你的程序,直到 tail 命令终止。
我认为您可以将输出重定向到一个文件并针对上一个版本使用“diff”来查看哪些行是新的?
【讨论】:
如果你有 unix 命令
tail -f <file> | <some java program>
然后尾部会显示为InputStream,可能会阻塞一段时间。如果您不想阻止自己,则可以使用 nio 包。我相信大多数其他访问tail命令的方法(例如Process)都会导致类似的InputStream。
【讨论】: