java - Java进程命令结果捕获结果失败
问题描述
我有一个 java 程序,它确实执行 shell 命令,然后等待命令从 shell 退出以获得结果。但是进程无法读取命令的输出,它只是将结果打印为空。
但是,如果我从 shell 提示符运行相同的命令,我可以看到结果打印在那里..
{
[root@localhost home]# tsp -I marker input.mpg -P marker -a 10 -v 10 -O file output.mpg
- 标记:10
- 标记:20
- 标记:30
- 标记:40
- 标记:50
- 标记:60
- 标记:70
- 标记:80
- 标记:90
- 标记:100
- 标记:OK [root@localhost home]#
}
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();
}
}
解决方案
您确定您的“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()));
希望这可以帮助..
推荐阅读
- ios - 在 Xcode 中的 ViewController 之间传递变量
- f# - 如何在 f# 中使用十六进制颜色?
- google-data-studio - 计数聚合然后取平均值
- javascript - 如何正确计算某个时刻的分钟数?
- jmeter - JMeter中的多用户登录
- javascript - 在 ios safari 上设置 datalist 列表属性后,datalist 输入元素丢失光标
- ios - 注销后更改rootviewcontroller
- c - Esp32 nodemcu GPIO
- c# - 在 c# LINQ 中将 dateTime "MM/dd/yyyy hh:mm:ss" 与 "yyyy-MM-dd hh:mm:ss" 进行比较
- c# - 仅匹配 C# 正则表达式中的第一次出现