Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用Java中的ProcessBuilder运行exe文件_Java_Processbuilder - Fatal编程技术网

无法使用Java中的ProcessBuilder运行exe文件

无法使用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<

我正在尝试运行exe文件,同时为其设置一些参数,如下所示:

myExePath -ini myIniPath -x myConfigFilePath myExePath-ini myIniPath-x myconfig文件路径 当我从命令行运行它时,它工作得非常好。但是,当我尝试从Java代码运行它时,进程会启动,但过了一段时间就没有响应了,所以我必须强制关闭它。我正在使用以下Java代码:

    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
)运行这最终会生成可执行文件。文章中提到的页面中的代码使用Java
Process
生成Windows命令解释器,后者将生成子进程。在问题的原始代码中,您正试图使用Java
Process
生成可执行文件本身。