Java 使用Runtime.getRuntime().exec()重定向不';行不通
我需要从程序中执行一个命令。命令行还可以,我在终端上试过了,但在程序中不起作用 我从我的代码中添加一个副本:Java 使用Runtime.getRuntime().exec()重定向不';行不通,java,process,runtime.exec,io-redirection,Java,Process,Runtime.exec,Io Redirection,我需要从程序中执行一个命令。命令行还可以,我在终端上试过了,但在程序中不起作用 我从我的代码中添加一个副本: 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
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");
}
File dir=新文件(“视频”);
String[]children=dir.list();
如果(children==null){
//目录不存在或不是目录
System.out.print(“不存在el directorio\n”);
}否则{
对于(int i=0;i而言,问题是重定向字符(
)是基于shell的构造,不是可执行文件。因此,除非您通过类似bash
的方式运行此命令(您不是这样),否则它将被解释为exiftool
调用的文本字符参数
如果要使其正常工作,有两种选择:
让bash来做这件事-将整个命令行作为参数传递给bash-c
。这可能需要一些英勇的转义,尽管在您的情况下看起来还可以
您自己在Java中执行重定向。在不使用重定向输出的情况下调用命令(即,直到>
符号的所有内容),然后从进程的outputstream读取并将所有内容写入相应的文件
后面的方法听起来像是最初的更多工作,但是当你考虑到你总是需要读取一个进程的输出(见第二段)时,实际上它几乎没有什么额外的。你只是把这个输出发送到一个文件而不是扔掉。< /P> < P>如果你有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”,但运行库负责样板文件。顺便说一句,避免说“它不起作用”。这不会给任何人提供任何信息(尽管在这种情况下它起作用了)。相反,你应该给出你得到的输出/错误消息,这些消息让你觉得有问题。如有必要,你还应该澄清你预期会发生什么,以及实际发生了什么(突出显示它们的不同之处).作为对Runtime.exec
相关问题的一般参考,我建议您阅读一篇古老但仍然非常合适的文章。