java - CreateProcess error=2, 系统找不到指定的文件

标签 java process

我正在用 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 的内容,否则可能会导致进程停止

关于java - CreateProcess error=2, 系统找不到指定的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19621838/

相关文章:

java - 从 Java 排序和比较 XML

java - 为什么一个进程运行但不显示?

java - 优雅地关闭生成的 java 子进程

c# - 为什么没有引发 OutputDataReceived 提示,从而阻止 AutoResetEvent 发出信号?

multithreading - 如何在 Perl 中列出和终止线程/进程而不使用外部命令?

Java - 在什么情况下 JVM 可能会突然崩溃?

java - collection.sort 如何以相反的顺序显示输出?

Java 枚举定义

java - 在滚动设计支持库上隐藏工具栏

java - 如何启动 "settings"应用程序?