首页 > 解决方案 > Java进程命令结果捕获结果失败

问题描述

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

但是,如果我从 shell 提示符运行相同的命令,我可以看到结果打印在那里..

{

[root@localhost home]# tsp -I marker input.mpg -P marker -a 10 -v 10 -O file output.mpg

}

Java程序在这里执行shell命令{

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();
    }

}

标签: javalinuxshellprocess

解决方案


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

我建议尝试

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

代替

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

希望这可以帮助..


推荐阅读