Java,系统命令无法运行

时间:2010-08-20 18:54:22

标签: java system

我正在尝试运行系统命令将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());

它运行时没有错误,但是文件被删除而不是在任何地方提取。

非常感谢任何帮助。

4 个答案:

答案 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)

刚试过这段代码。它有效。

检查你的路径。