Runtime.getRuntime()。exec()不起作用

我需要从一个程序执行一个命令。 命令行是好的,我在terminal上试了一下,但是在程序中不起作用。

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

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

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

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

如果你想得到这个工作,你有两个select:

  1. 得到bash来做 – 把整个命令行作为parameter passing给bash -c 。 这可能需要一些英雄逃跑,虽然在你的情况下,它看起来不错。
  2. 在Java中自己做redirect。 调用不带redirect输出的命令(即所有内容都符合> ),然后从进程输出stream中读取并将所有内容写入相应的文件。

后面的方法听起来像是最初的工作,但是当你认为你总是需要阅读一个Process的输出 (参见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(); 

这属于“解决scheme2”,但运行时库会照顾样板。