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

时间:2010-06-28 07:50:02

标签: 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");
    }

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

2 个答案:

答案 0 :(得分:13)

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

如果您想让它发挥作用,您有两种选择:

  1. 获取bash来执行此操作 - 将整个命令行作为参数传递给bash -c。这可能需要一些英勇的逃避,虽然在你的情况下它看起来不错。
  2. 在Java中自行重定向。在没有重定向输出的情况下调用命令(即一切都达到>符号),然后从进程'outputstream读取并将所有内容写入相应的文件。
  3. 后一种方法听起来像最初的工作,但当你认为你总是需要总是阅读一个过程'输出(参见javadocs,第二段),它实际上非常最重要的是。您只需将此输出发送到文件而不是将其丢弃。

答案 1 :(得分:3)

如果你有Java 7,那就更容易了:

Process p = new ProcessBuilder()
    .command("exiftool", "-a", "-u", "-g1", "-j",
             new File("videos", filename).toString())
    .redirectOutput(new File("metadata", filename + ".json"))
    .start();

这属于“解决方案2”,但运行时库负责样板。