无法使用Java中的ProcessBuilder运行exe文件
我正在尝试运行exe文件,同时为其设置一些参数,如下所示: myExePath -ini myIniPath -x myConfigFilePath myExePath-ini myIniPath-x myconfig文件路径 当我从命令行运行它时,它工作得非常好。但是,当我尝试从Java代码运行它时,进程会启动,但过了一段时间就没有响应了,所以我必须强制关闭它。我正在使用以下Java代码:无法使用Java中的ProcessBuilder运行exe文件,java,processbuilder,Java,Processbuilder,我正在尝试运行exe文件,同时为其设置一些参数,如下所示: myExePath -ini myIniPath -x myConfigFilePath myExePath-ini myIniPath-x myconfig文件路径 当我从命令行运行它时,它工作得非常好。但是,当我尝试从Java代码运行它时,进程会启动,但过了一段时间就没有响应了,所以我必须强制关闭它。我正在使用以下Java代码: List<String> parameters = new ArrayList<
List<String> parameters = new ArrayList<String>();
parameters.add(myexePath);
parameters.add("-ini ");
parameters.add(myIniPath);
parameters.add("-x ");
parameters.add(myConfigPath
ProcessBuilder builder = new ProcessBuilder(parameters);
Process process = builder.start();
try {
process.waitFor();
} catch (InterruptedException e) {
System.err.println("Process was interrupted");
}
List parameters=new ArrayList();
添加参数(myexePath);
参数。添加(“-ini”);
参数.add(myIniPath);
参数。添加(“-x”);
添加参数(myConfigPath
ProcessBuilder=新的ProcessBuilder(参数);
Process=builder.start();
试一试{
process.waitFor();
}捕捉(中断异常e){
System.err.println(“进程被中断”);
}
你知道我做错了什么吗?我不确定这是否有帮助,但为什么要使用空格? e、 g.:
参数。添加(“-x”);
你不需要它们
您还可以尝试将所有参数放在一个数组中,并使用另一个以数组为参数的ProcessBuilder构造函数。exe是否使用stdout、stderr、stdin?您应该始终读取或关闭它们。根据实现和缓冲区大小,不读取它们可能导致阻塞。您应该首先获得对
运行时的引用
您可以这样做
Runtime.getRuntime().exec(parameters.toString());
参数列表中的字符串可能需要一些格式设置。您可以粘贴堆栈跟踪吗?运行waitFor()后,我没有得到任何进程停止响应,我必须从任务管理器关闭它,只有这样我才能在Java代码中前进。看起来myExePath子进程正在阻塞。它做什么?为什么需要很长时间才能完成,导致您终止子进程?它需要单独的控制台输入吗?它需要单独的控制台输出吗ut?如果有,它不能继承父进程的std I/O句柄,这样它就不会阻止父进程的std I/O句柄。它可以通过Windows下的匿名管道实现。我认为Java 7现在支持这一点。在以前的Java版本中,您必须使用JNI或JNA来创建带有匿名管道的子进程。我尝试了th带空格和不带空格,带“”表示路径,不带空格,在数组字符串中[]还有一个列表…它不工作。我记得有类似的问题。我的进程是在循环中执行的,经过一些周期后它挂起。你使用循环还是线程?你能发布更多的代码吗?线程…我在任务管理器中再次检查,我发现当我从命令行运行exe时,它只启动一个线程,当我运行它时,它会自动启动在Java代码中创建了两个线程。我认为这是阻塞的原因,但我不理解为什么创建了两个线程。我认为您有两个线程是可以的。一个是Java应用程序的主线程,另一个是您启动的外部进程。请参阅本页的示例:查看示例…添加了InputStream的一部分,现在它工作了。不知道为什么它工作,但感谢@martiellI,我想文章的其余部分可能解释了它;我没有看。我只是直接链接到代码,希望它能帮助您更快地工作。我认为这个想法是缓冲区的大小有限,所以如果您不从中读取,那么这个过程必须等到那里的空间。否则,输出将丢失。如果您正在查看GoodWindowsExec.java示例并使用它,则实际上不是从可执行文件运行,而是从Windows命令解释器(由java进程生成的command.exe或cmd.exe
)运行这最终会生成可执行文件。文章中提到的页面中的代码使用JavaProcess
生成Windows命令解释器,后者将生成子进程。在问题的原始代码中,您正试图使用JavaProcess
生成可执行文件本身。