Java进程命令结果无法捕获结果

时间:2018-07-18 10:08:26

标签: java linux shell process

我有一个Java程序,它确实执行shell命令,然后等待命令从shell退出以获得结果。但是Process无法从命令中读取输出,只是将结果打印为空。

但是,如果我从shell提示符运行,则可以看到相同的命令。

{

[root @ localhost主页]#tsp -I标记input.mpg -P标记-a 10 -v 10 -O文件output.mpg

  • 标记:10
  • 标记:20
  • 标记:30
  • 标记:40
  • 标记:50
  • 标记:60
  • 标记:70
  • 标记:80
  • 标记:90
  • 标记:100
  • 标记:确定 [root @ localhost主页]#

}

在此处执行shell命令的Java程序 {

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class ExecuteShellComand {

public static void main(String[] args) {

    ExecuteShellComand obj = new ExecuteShellComand();

    String command = "tsp -I olesmarker input.mpg -P " + "olesmarker -a 10 -v 10 -O file output.mpg";

    String output = obj.executeCommand(command);

    System.out.println("Command Result = " + output);

}

private String executeCommand(String command) {
    StringBuilder output = new StringBuilder();
    Process p;
    try {
        p = Runtime.getRuntime().exec(command);
        p.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

        String line = "";
        while ((line = reader.readLine()) != null) {
            output.append(line + "\n");
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return output.toString();
    }

}

1 个答案:

答案 0 :(得分:1)

您确定您的“ tsp”程序正在生成这些“标记”进度消息以将其标准化吗?一些程序正在使用Shell标准的err通道。尤其是进行转换的程序(“ -O文件output.mpg”表示这种功能)通常将shell-std.out用作转换结果的默认输出,而将shell-sdt.err用作状态和进度消息。 (对于将命令与外壳上的管道连接非常有用)。

我建议尝试

    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getErrorStream()));

代替

    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

希望这会有所帮助。