Runtime.getRuntime()。exec()输出与直接执行命令行程序不同

时间:2013-05-20 14:33:17

标签: java command-line

运行

/usr/bin/mediainfo --Inform='Video;%Duration%' /home/daniel/upload/videos/4/f/6/e/f/4f6ef2e0d67c4.flv
来自终端的

给我输出

  

903520

在java中运行它

        Process p1;
    try {
        p1 = Runtime.getRuntime().exec("/usr/bin/mediainfo --Inform='Video;%Duration%' /home/daniel/upload/videos/4/f/6/e/f/4f6ef2e0d67c4.flv");

        BufferedReader input1 = new BufferedReader(new InputStreamReader(p1.getInputStream()));
        String line1;
        while ((line1 = input1.readLine()) != null) {
            System.out.println("-"+line1);
        }
        input1.close();         

        p1.waitFor();               


    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

结果

-General
-Complete name : /home/daniel/upload/videos/4/f/6/e/f/4f6ef2e0d67c4.flv
-Format                                   : Flash Video
-File size                                : 62.0 MiB
-Duration                                 : 15mn 3s
-Overall bit rate                         : 576 Kbps
-Tagging application       : Yet Another Metadata Injector for FLV - Version 1.4
-
-Video
-Format                                   : AVC
-Format/Info                              : Advanced Video Codec
-Format profile                           : High@L2.0
-Format settings, CABAC                   : Yes
-Format settings, ReFrames                : 4 frames
-Codec ID                                 : 7
-Duration                                 : 15mn 3s
-Bit rate                                 : 512 Kbps  
(much more here) ... 

如何从Runtime.getRuntime()。exec(cmd)获取所需的输出(903520)?

编辑:修复格式

2 个答案:

答案 0 :(得分:4)

命令行shell为你做了一些魔术,Runtime.exec()为你做 NOT

在这种情况下,我想,shell会解释(并省略)命令行中的'标记。

所以请尝试这个版本,其中'已被删除,命令行已被手工分割成部分(另一个常见问题):

String[] args = new String[]{
    "/usr/bin/mediainfo",
    "--Inform=Video;%Duration%",
    "/home/daniel/upload/videos/4/f/6/e/f/4f6ef2e0d67c4.flv"
};
Runtime.getRuntime().exec(args);

答案 1 :(得分:1)

请注意,Runtime.exec(String) Runtime.exec(String[]) 您是否尝试过第二种方法,只是为了确保字符串命令按照它的方式进行解释?

来自文档:

public Process exec(String command)
             throws IOException
  

在单独的进程中执行指定的字符串命令。 (...)


public Process exec(String[] cmdarray)
             throws IOException
  

在单独的进程中执行指定的命令和参数。 (...)


您可以尝试:

String[] myArgs = new String[]{
    "/usr/bin/mediainfo",
    "--Inform='Video;%Duration%'",
    "/home/daniel/upload/videos/4/f/6/e/f/4f6ef2e0d67c4.flv"
};

Process p1;
try {
    p1 = Runtime.getRuntime().exec(myArgs);
        ...
}