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:
- 得到bash来做 – 把整个命令行作为parameter passing给
bash -c
。 这可能需要一些英雄逃跑,虽然在你的情况下,它看起来不错。 - 在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”,但运行时库会照顾样板。