[英]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
调用的文字字符参数。
如果你想让它工作,你有两个选择:
bash -c
。 这可能需要一些英勇的逃避,虽然在你的情况下它看起来不错。 >
符号),然后从进程'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.