我正在尝试运行系统命令将tar.bz2文件解压缩到指定目录。这是代码:
ProcessBuilder myProc = new ProcessBuilder("tar", "-xjf", "/path/to/MyTarFile.tar.bz2");
myProc.directory(new File("/directory/i/want/results/in/"));
myProc.start();
System.out.println(myProc.command());
它运行时没有错误,但是文件被删除而不是在任何地方提取。
非常感谢任何帮助。
答案 0 :(得分:6)
我知道Runtime.exec()有a really nasty feature,如果你不手动排空STDOUT / STDERR,它实际上似乎挂起了。我希望ProcessBuilder能够纠正这个缺陷,但是this page包含了这个小问题:
关于本提示中的示例,请注意。如果子进程生成足够的输出以溢出系统,则示例可能会死锁。更强大的解决方案需要将进程stdout和stderr耗尽在单独的线程中。
因此,请确保您正在处理Process.getInputStream()和Process.getErrorStream(),正如我在评论中所建议的那样;它可以彻底解决问题!
答案 1 :(得分:3)
将myProc.start();
行更改为
Process p = myProc.start();
p.waitFor();
这将确保您的程序在tar完成之前不会退出。
答案 2 :(得分:2)
运行此命令以查看错误。也许您的一条路径不正确。
import java.io.File;
import java.io.InputStream;
public class Untar {
public static void main(String[] args) throws Exception {
ProcessBuilder myProc = new ProcessBuilder("tar", "-xjf", "foo.tar.bz2");
myProc.directory(new File("newdir"));
Process p = myProc.start();
InputStream is = p.getErrorStream();
int c;
while( (c = is.read()) != -1 ){
System.out.print((char)c);
}
p.waitFor();
System.out.println(myProc.command());
}
}
答案 3 :(得分:0)
刚试过这段代码。它有效。
检查你的路径。