我需要从程序中执行命令。命令行没问题,我在终端试了一下,但它在程序中不起作用。
我从代码中添加了一个副本:
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文件。
问题在哪里?
答案 0 :(得分:13)
问题是,重定向字符(>
)是基于shell的构造,不是是可执行文件。因此,除非您通过类似bash
(您不是)的方式运行此命令,否则它将被解释为exiftool
调用的文字字符参数。
如果您想让它发挥作用,您有两种选择:
bash -c
。这可能需要一些英勇的逃避,虽然在你的情况下它看起来不错。>
符号),然后从进程'outputstream读取并将所有内容写入相应的文件。后一种方法听起来像最初的工作,但当你认为你总是需要总是阅读一个过程'输出(参见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”,但运行时库负责样板。