java运行linux命令获得返回值的问题
我有java代码Stringcmd="ifconfig";inputStream=Runtime.getRuntime().exec(cmd);此时在linux下执行代码...
我有java代码
String cmd = "ifconfig";
inputStream = Runtime.getRuntime().exec(cmd);
此时在linux下执行代码之后,这个inputStream里面是又内容的,我可以read到值。
问题是我把cmd改成一个获取视频时长的命令
("ffmpeg -i myVideoPath 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//")
(需要装ffmpeg软件)并执行之后,inputStream是空的,什么都read不到。
但单独在linux控制台执行这段命令却明明会显示出视频时长。见图:
请问这是为什么?为什么在java中执行获取时长的命令就得到一个空的stream呢?
帮帮忙谢谢, 展开
String cmd = "ifconfig";
inputStream = Runtime.getRuntime().exec(cmd);
此时在linux下执行代码之后,这个inputStream里面是又内容的,我可以read到值。
问题是我把cmd改成一个获取视频时长的命令
("ffmpeg -i myVideoPath 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//")
(需要装ffmpeg软件)并执行之后,inputStream是空的,什么都read不到。
但单独在linux控制台执行这段命令却明明会显示出视频时长。见图:
请问这是为什么?为什么在java中执行获取时长的命令就得到一个空的stream呢?
帮帮忙谢谢, 展开
展开全部
inputStream = Runtime.getRuntime().exec(cmd);
java的这个方式,得到的是控制台的输出流,
也就是linux命令运行完,显示在屏幕上的东西,都以流的方式传递给java了,
可以通过下边的方式
InputStreamReader insr = new InputStreamReader(inputStream, “GBK”);
BufferedReader br = new BufferedReader(insr);
while (br.ready()) {
String line = br.readLine();
}
得到屏幕上显示的一行行内容,解析得到你想要的结果。
InputStreamReader 最后一个参数,是设置显示流是什么字符集的,如果不正确,请自行调整一下。
java的这个方式,得到的是控制台的输出流,
也就是linux命令运行完,显示在屏幕上的东西,都以流的方式传递给java了,
可以通过下边的方式
InputStreamReader insr = new InputStreamReader(inputStream, “GBK”);
BufferedReader br = new BufferedReader(insr);
while (br.ready()) {
String line = br.readLine();
}
得到屏幕上显示的一行行内容,解析得到你想要的结果。
InputStreamReader 最后一个参数,是设置显示流是什么字符集的,如果不正确,请自行调整一下。
追问
打印出来的还是无内容。
inputStream都已经是无内容了,后面的封装肯定也没有效果
追答
首先在linux下执行你所需要的命令,确认有结果返回。
具体代码如下
public static String getShellExecuted(String cmnd) {
InputStream in = null;
InputStreamReader insr = null;
BufferedReader br = null;
StringBuffer buff = new StringBuffer();
try {
Process process = Runtime.getRuntime().exec("sh /usr " + cmnd);
process.waitFor();
in = process.getInputStream();
insr = new InputStreamReader(in, "GBK");
br = new BufferedReader(insr);
while (br.ready()) {
String line = br.readLine();
buff.append(line + "\r\n");
}
} catch (Exception e) {
}
return buff.toString();
}这样你再试试。
展开全部
因为有shell pipe。看这个例子:
String[] cmd = {
"/bin/sh",
"-c",
"ls /etc | grep release"
};
Process p = Runtime.getRuntime().exec(cmd);
追问
看不明白什么意思,麻烦能说详细一点么?我这个问题怎么解决呢?本人linux有点小白,
追答
就是 把 "ls /etc | grep release" 替换成你的 ”ffmpeg 。。。。。。。。“ 这串命令。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
管道命令是通过/bin/sh 解析的,java exec用的是系统exec函数族,所以就按照上面那个执行方法就好了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询