Java readLine()使用Runtime.exec和BufferedStream挂起最后一行
我正在使用本文中提到的正确做法: 我同时读取输出和错误流。但是,在读取进程的输出流时,它挂起在最后一行之后的readLine()上。我不知道如何解决这个问题。这是过程的主线,它就挂在那里 挂起此命令的命令是paexec\192.168.1.92-c-f c:\Windows\ITBBsync0.bat 批处理文件中有以下几行:devcon.exe status=USB>C:\Windows\output.txt 当我在命令行上执行它时,进程退出,代码为0。当我在Java中执行它时,它在读取输出的最后一行(基本上是批处理文件的最后一行)后挂起。我认为这一过程并不存在,这就是问题发生的原因Java readLine()使用Runtime.exec和BufferedStream挂起最后一行,java,readline,Java,Readline,我正在使用本文中提到的正确做法: 我同时读取输出和错误流。但是,在读取进程的输出流时,它挂起在最后一行之后的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上的许多线程,据我所知,我正在为此使用最佳实践。请让我知道如何解决这个问题,或者为什么会发生这种情况
我不能确切地告诉您我正在执行的应用程序,因为它有点复杂,但该应用程序执行一些网络操作,还执行一个批处理文件,该批处理文件又包含更多操作。好消息:在您完成读取之后,通过调用
close
关闭读卡器/inputStream,您确定外部进程正在退出吗?你能提供一个你正在运行的命令的例子,它会导致这个挂起吗?你用什么命令来测试它?使用ipconfig
进行测试未生成任何错误SPAEXEC\\192.168.1.92-c-f c:\Windows\ITBBsync0.batI已编辑了有关该命令的一些详细信息