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

时间:2013-10-27 18:35:17

标签: 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

有谁能告诉我为什么遇到这样的问题。我需要在代码中加入哪些更改以使其有效?

6 个答案:

答案 0 :(得分:35)

假设winrar.exe位于PATH,那么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的内容,因为如果不这样做可能会拖延流程

答案 1 :(得分:10)

我使用过ProcessBuilder但遇到了同样的问题。问题是使用命令作为一个String行(就像我在cmd中键入它)而不是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();

我收到了一个错误。但如果我跑了

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();
一切都很好。

答案 2 :(得分:8)

您指定的dir是运行进程的工作目录 - 它无助于查找可执行文件。使用cmd /c winrar ...运行查找 PATH 中的可执行文件的流程,或尝试使用 winrar 绝对路径。

答案 3 :(得分:1)

exec的完整第一个参数被解释为可执行文件。使用

p = rt.exec(new String[] {"winrar.exe", "x", "h:\\myjar.jar", "*.*", "h:\\new" }
            null, 
            dir);

答案 4 :(得分:1)

我的推荐是保留getRuntime().exec,因为exec使用ProcessBuilder

尝试

 p=r.exec(new String[] {"winrar", "x", "h:\\myjar.jar", "*.*", "h:\\new"}, null, dir);

答案 5 :(得分:-4)

下载jdk最新版本,并将android studio项目设置中的jdk位置更改为新的jdk位置。 http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-windows-x64.exe?AuthParam=1539152029_7892043961e90bd9f5bdfc884ddf0b07

如果这不起作用,请从高级系统变量中将ur PATH设置为新的jdk位置