readLine()使用Runtime.exec和BufferedStream在最后一行挂起

时间:2014-04-28 20:37:27

标签: java readline

我正在使用本文中提到的正确做法:

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上的许多线程,据我所知,我正在使用最佳实践。请告诉我如何解决这个问题或为什么会这样。

我无法准确地为您提供正在执行的应用程序,因为它有点复杂,但应用程序执行一些网络操作并执行批处理文件,而该批处理文件又包含更多操作。

0 个答案:

没有答案