我正在用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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行此操作时,我收到此错误
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
Run Code Online (Sandbox Code Playgroud)
有人能告诉我为什么遇到这样的问题.我需要在代码中加入哪些更改以使其有效?
Mad*_*mer 39
假设它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");
Run Code Online (Sandbox Code Playgroud)
就个人而言,我建议您使用,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();
Run Code Online (Sandbox Code Playgroud)
不要忘记阅读过程中的内容InputStream,因为如果不这样做可能会拖延进程
小智 14
我使用过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();
Run Code Online (Sandbox Code Playgroud)
我收到了一个错误.但如果我跑了
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();
Run Code Online (Sandbox Code Playgroud)
一切都很好.