在我的代码中,我使用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“接管”控制台并显示其进度输出,提示等提示,直到完成,然后将控制台返回给我的应用程序,有没有办法做到这一点?

最佳答案

不要使用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();


10-07 21:07