Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Runtime.getRuntime().exec()重定向不';行不通_Java_Process_Runtime.exec_Io Redirection - Fatal编程技术网

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
    相关问题的一般参考,我建议您阅读一篇古老但仍然非常合适的文章。