我正在运行程序中的.exe
文件,并且需要一定的时间。此命令的输出在以下语句中用于进一步处理。输出是一个布尔变量。但程序立即返回false
,但事实上命令仍在执行中并且需要一定的时间。由于错误值,后续语句会引发错误。我该如何处理这种情况。
return_var = exec(pagecmd)
是执行语句。
boolean return_var = false;
if("true".equals(getConfig("splitmode", ""))){
System.out.println("Inside splitmode if**********************");
String pagecmd = command.replace("%", page);
pagecmd = pagecmd + " -p " + page;
File f = new File(swfFilePath);
System.out.println("The swffile inside splitmode block exists is -----"+f.exists());
System.out.println("The pagecmd is -----"+pagecmd);
if(!f.exists()){
return_var = exec(pagecmd);
System.out.println("The return_var inside splitmode is----"+return_var);
if(return_var) {
strResult=doc;
}else{
strResult = "Error converting document, make sure the conversion tool is installed and that correct user permissions are applied to the SWF Path directory" +
getDocUrl();
}
答案 0 :(得分:0)
假设您最终在exec()
方法中使用Runtime.exec()
,则可以使用从Runtime.exec()
返回的waitFor()
对象的Process
方法等到执行完毕:
...
Process p = Runtime.getRuntime().exec(pagecmd);
int result = p.waitFor();
...
waitFor()
的返回值是子流程的退出代码。
如果您确实需要从子流程写入其stderr
或stdout
频道的子流程读取输出,则需要使用{{1} (注意:不 Process.getInputStream()
)和getOutputStream()
并读取这些流的子流程输出。然后,检查流的Process.getErrorStream()
方法的返回值,以检查子进程是否已终止(或至少关闭其输出流),而不是使用read()
。
此外,对于这类问题,您应该考虑使用Apache commons exec库。
或者,您可能需要查看ProcessBuilder
类。
答案 1 :(得分:0)
与Andreas建议的waitFor()一起使用时,您可能还需要使用exec()返回的Process对象的getInputStream来检索正在执行的程序所写的数据。