如何让Runtime.exec()调用的应用程序“接管”控制台直到它完成?

时间:2016-03-16 14:49:36

标签: java command-line

在我的代码中,我使用7z命令行来提取存档

 public static void extract() {
    Runtime rt = Runtime.getRuntime();
    try {
        Process pr = rt.exec("7za x -o"+ tempFolderStr +" "+sourceStr);
        pr.waitFor();
    } catch (Exception e) {
        e.printStackTrace();
        out("Error extracting " + sourceStr);
        quit();
    }

    //if tempFolder doesn't exists 7zip failed to extract for whatever reason
    tempFolder = new File(tempFolderStr);

    if (!tempFolder.exists()){
        out("Error extracting " + sourceStr);
        quit();
    }

    source = tempFolder;
}

然而,如果大型档案需要一段时间,对于用户来说可能并不明显,如果它只是提取操作或者是我自己的应用程序挂起(除了提取之外还有很多其他的事情要做用户之前)被提示再次做任何事情),加上提取本身可能会暂停,比如因为存档受密码保护或其他什么

因为这个原因我希望7zip“接管”控制台并显示其进度输出,提示等等直到它完成然后将控制台返回到我的应用程序,有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

请勿使用Runtime.exec(),使用ProcessBuilder.inheritIO()

final List<String> command = Arrays.asList(
    "7za", "x", "-o", tempFolder, sourceStr
);

final ProcessBuilder pb = new ProcessBuilder(command).inheritIO();

final int retcode = pb.start().waitFor();

等等