我正在使用本文中提到的正确做法:
http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2
我同时读取输出和错误流。但是,在读取进程的输出流时,它会在最后一行之后挂起readLine()。我不知道如何解决这个问题。这是流程的一部分,它只是挂在那里。
挂起它的命令是paexec \ 192.168.1.92 -c -f C:\ Windows \ ITBBsync0.bat。
在批处理文件中有几行,如下所示:devcon.exe status = USB> C:\ Windows \ output.txt
当我在命令行执行它时,进程退出时使用代码0.当我在Java中执行它时,它会在读取最后一行输出(这基本上是批处理文件的最后一行)后挂起。我认为这个过程并没有退出,这就是问题发生的原因。
import java.io.*;
class StreamGobbler extends Thread
{
InputStream is;
String type;
StreamGobbler(InputStream is, String type)
{
this.is = is;
this.type = type;
}
public void run()
{
try
{
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line=null;
while ((line = br.readLine()) != null){
System.out.println(type + ">" + line);
//hangs after reading last line.
}
} catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}
使用StreamGobbler的方法如下。显然有一个父类执行此方法。
public static boolean cmd(String command){
try{
Runtime rt = Runtime.getRuntime();
System.out.println("Execing " + command);
Process p = rt.exec(command);
// any error message?
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(),"ERROR");
StreamGobbler outputGobbler = new StreamGobbler(p.getInputStream(), "OUTPUT");
errorGobbler.start();
outputGobbler.start();
int exitVal = p.waitFor();
if (exitVal != 0){
System.out.println("ExitValue: " + exitVal);
System.out.println(command + "EXIT CODE:" + exitVal);
return false;
}
return true;
}catch(IOException ioe){
ioe.printStackTrace();
return false;
}catch(InterruptedException ie){
ie.printStackTrace();
return false;
}
}
我已经访问了StackOverflow上的许多线程,据我所知,我正在使用最佳实践。请告诉我如何解决这个问题或为什么会这样。
我无法准确地为您提供正在执行的应用程序,因为它有点复杂,但应用程序执行一些网络操作并执行批处理文件,而该批处理文件又包含更多操作。