使用Runtime.getRuntime().exec()重定向不起作用

Bla*_*dez 6 java process runtime.exec io-redirection

我需要从程序执行命令.命令行没问题,我在终端试了一下,但它在程序中不起作用.

我从我的代码中添加了一个副本:

  File dir = new File("videos"); 
  String[] children = dir.list(); 
  if (children == null) { 
   // Either dir does not exist or is not a directory 
   System.out.print("No existe el directorio\n");
   } else { 
    for (int i=0; i<children.length; i++) { 
     // Get filename of file or directory 
     String filename = children[i];

     //Recojo el momento exacto
     System.out.print("\n" +filename);

     Process p = Runtime.getRuntime().exec("exiftool -a -u -g1 -j videos/"+filename+">metadata/"+filename+".json");
    }
Run Code Online (Sandbox Code Playgroud)

程序必须获取文件夹(文件名)中所有文件的名称,并提取theese视频的元数据,将它们写入文件夹"元数据"中的.json文件.
问题出在哪儿?

And*_*yle 13

问题是,重定向字符(>)是基于shell的构造,而不是可执行文件.因此,除非你通过类似bash(你不是)之类的东西运行这个命令,否则它将被解释为你的exiftool调用的文字字符参数.

如果你想让它工作,你有两个选择:

  1. 获取bash来做 - 将整个命令行作为参数传递给bash -c.这可能需要一些英勇的逃避,虽然在你的情况下它看起来不错.
  2. 在Java中自己进行重定向.调用没有重定向输出的命令(即>符号的所有内容),然后从进程'outputstream读取并将所有内容写入相应的文件.

后一种方法听起来像最初的工作,但是当你认为你总是需要总是阅读一个进程的输出(参见javadocs,第二段)时,它实际上是非常少的额外的.您只是将此输出发送到文件而不是丢弃它.

  • 作为对"Runtime.exec"相关问题的一般参考,我建议古老的,但仍然非常合适的文章[当Runtime.exec()不会](http://www.javaworld.com/jw-12-2000/ JW-1229-traps.html). (3认同)