【问题标题】:Get output of terminal command using Java使用 Java 获取终端命令的输出
【发布时间】:2013-02-01 15:28:55
【问题描述】:

对于某些终端命令,它们会重复输出。例如,对于正在生成文件的内容,它可能会输出完成的百分比。

我知道如何使用 Java 调用终端命令

Process p = Runtime.getRuntim().exec("command goes here");

但这并不能让我实时了解命令的当前输出。我怎样才能做到这一点,以便我可以每 100 毫秒执行一次 System.out.println(),例如,查看进程的最新输出是什么。

【问题讨论】:

标签: java terminal runtime


【解决方案1】:

你需要从进程中读取InputStream,这里是一个例子:

编辑我将代码修改为suggested here 以接收带有stdInputerrStream

ProcessBuilder builder = new ProcessBuilder("command goes here");
builder.redirectErrorStream(true);
Process process = builder.start();
InputStream is = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));

String line = null;
while ((line = reader.readLine()) != null) {
   System.out.println(line);
}

出于调试目的,您可以将输入读取为字节而不是使用readLine,以防进程不会终止带有newLine 的消息

【讨论】:

  • 我试过了,但它似乎在 in.readLine() 处冻结(它不输出任何内容,但不会结束 while 循环)
  • 也许您正在运行的命令没有输出任何 \r 或 \n 字符(这会向 BufferedReader 发出它已读取完整行的信号)?也许它在某些终端模式下不会产生任何输出(尝试将结果通过管道传输到“更多”并查看它输出的内容)?也许该命令将其输出写入 stderr 而不是 stdout?
  • 它将冻结等待输入,因此您的进程不会使用newline 终止数据,或者根本不会写入stdout
  • @dnault 查看我在此处发布的代码,了解我尝试的 Java 代码的详细信息:stackoverflow.com/questions/14915290/…
  • @CodeGuy 尝试直接执行 mencoder。此外,将命令指定为 String[] 而不是单个 String(以防任何参数包含空格)。
猜你喜欢
  • 1970-01-01
  • 2019-01-06
  • 2013-09-06
  • 1970-01-01
  • 2015-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多