java运行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呢?
帮帮忙谢谢,

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 最后一个参数,是设置显示流是什么字符集的,如果不正确,请自行调整一下。追问

打印出来的还是无内容。
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();
        }

    这样你再试试。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-07-26

因为有shell pipe。看这个例子:

String[] cmd = {
"/bin/sh",
"-c",
"ls /etc | grep release"
};

Process p = Runtime.getRuntime().exec(cmd);

追问

看不明白什么意思,麻烦能说详细一点么?我这个问题怎么解决呢?本人linux有点小白,

追答

就是 把 "ls /etc | grep release" 替换成你的 ”ffmpeg 。。。。。。。。“ 这串命令。

本回答被提问者采纳
第2个回答  2013-07-26
管道命令是通过/bin/sh 解析的,java exec用的是系统exec函数族,所以就按照上面那个执行方法就好了
相似回答