6

我需要从程序执行命令。命令行没问题,我在终端试了下,在程序里不行。

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

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

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

4

2 回答 2

13

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

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

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

后一种方法最初听起来像是更多的工作,但是当您考虑到无论如何都需要始终读取 Process 的输出时(请参阅javadocs的第二段),除此之外实际上几乎没有额外的工作。您只是将此输出发送到文件而不是将其丢弃。

于 2010-06-28T08:01:43.560 回答
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”,但运行时库负责样板。

于 2013-10-24T04:25:31.977 回答