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

我正在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 xh:\\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.(Unknown Source) at java.lang.ProcessImpl.start(Unknown Source) ... 4 more 

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

假设winrar.exePATH ,那么Runtime.exec能够找到它,如果不是,你将需要提供它的完全限定路径,例如,假设在C:/Program Files/WinRAR安装了winrar.exe C:/Program Files/WinRAR你需要使用像……

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

就个人而言,我建议您使用ProcessBuilder因为它具有一些额外的配置function。 在可能的情况下,您还应该将命令和参数分离为单独的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的内容,因为如果不这样做可能会使进程停顿

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

我使用过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(); 

一切都很好。

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

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

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

尝试

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

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

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