我正在用Java编写一个程序,该程序将执行winrar并将一个保存在h:\myjar.jar中的jar文件解压缩到h:\new文件夹中。我的Java代码是这样的

import java.io.File;
import java.io.IOException;

public class MainClass {

    public static void main(String[] args) {

        Runtime r = Runtime.getRuntime();
        Process p = null;

        try {
            File dir = new File("C:/Program Files/WinRAR");
            p = r.exec("winrar x h:\\myjar.jar *.* h:\\new", null, dir);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

执行此操作时,出现此错误
java.io.IOException: Cannot run program "winrar" (in directory "C:\Program Files\WinRAR"): CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessBuilder.start(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at java.lang.Runtime.exec(Unknown Source)
    at MainClass.main(MainClass.java:16)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at java.lang.ProcessImpl.create(Native Method)
    at java.lang.ProcessImpl.<init>(Unknown Source)
    at java.lang.ProcessImpl.start(Unknown Source)
    ... 4 more

谁能告诉我为什么会遇到这样的问题。为了使其起作用,我需要在代码中进行哪些更改?

最佳答案

假设winrar.exePATH中,则Runtime.exec能够找到它,如果不是,则需要提供其完全限定的路径,例如,假设winrar.exe安装在C:/Program Files/WinRAR中,则需要使用类似的东西。 ..

p=r.exec("C:/Program Files/WinRAR/winrar x h:\\myjar.jar *.* h:\\new");

就个人而言,我建议您使用ProcessBuilder,因为它除了其他功能外还具有一些其他配置功能。在可能的情况下,还应将命令和参数分成单独的String元素,例如,与单个String变量相比,它可以更好地处理诸如空格之类的问题。
ProcessBuilder pb = new ProcessBuilder(
    "C:/Program Files/WinRAR/winrar",
    "x",
    "myjar.jar",
    "*.*",
    "new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);

Process p = pb.start();

不要忘记从流程中读取InputStream的内容,否则可能会导致流程停止

10-08 02:34