繁体   English   中英

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

[英]Redirection with Runtime.getRuntime().exec() doesn't work

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM