【问题标题】:Redirection with Runtime.getRuntime().exec() doesn't work使用 Runtime.getRuntime().exec() 重定向不起作用
【发布时间】:2010-06-28 07:50:02
【问题描述】:

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

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

  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 文件中。
问题出在哪里?

【问题讨论】:

  • 顺便说一句 - 避免说“它不起作用”。这并没有给任何人任何继续下去的信息(尽管在这种情况下它成功了)。相反,您应该给出让您认为有问题的输出/错误消息。如有必要,您还应该说明您预计会发生什么,以及实际会发生什么(突出它们的不同之处)。

标签: java process runtime.exec io-redirection


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案2】:

如果你有 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”,但运行时库负责样板文件。

【讨论】:

    猜你喜欢
    • 2011-06-12
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多