Runtime.getRuntime()。exec(cmd)挂起

Runtime.getRuntime()。exec(cmd)挂起,第1张

Runtime.getRuntime()。exec(cmd)挂起

我想问题是您只在读取InputStream而没有在读取ErrorStream。您还必须注意并行读取两个流。可能发生这种情况,当前从输出流中管道传输的数据已填满OS缓冲区,您的exec命令将自动挂起,以使您的阅读器有机会清空缓冲区。但是程序仍将等待输出处理。因此,发生挂起。

您可以创建一个单独的类来处理输入流和错误流,如下所示,

public class ReadStream implements Runnable {    String name;    InputStream is;    Thread thread;          public ReadStream(String name, InputStream is) {        this.name = name;        this.is = is;    }public void start () {        thread = new Thread (this);        thread.start ();    }public void run () {        try { InputStreamReader isr = new InputStreamReader (is); BufferedReader br = new BufferedReader (isr);    while (true) {     String s = br.readLine ();     if (s == null) break;     System.out.println ("[" + name + "] " + s); } is.close (); } catch (Exception ex) { System.out.println ("Problem reading stream " + name + "... :" + ex); ex.printStackTrace ();        }    }}

使用方式如下:

String cmd= "cmd /C si viewhistory --fields=revision --project="+fileName; Process p = Runtime.getRuntime().exec(cmd) ;  s1 = new ReadStream("stdin", p.getInputStream ());s2 = new ReadStream("stderr", p.getErrorStream ());s1.start ();s2.start ();p.waitFor();        } catch (Exception e) {  e.printStackTrace();  } finally {    if(p != null)        p.destroy();}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5010782.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-14
下一篇2022-11-14

发表评论

登录后才能评论

评论列表(0条)

    保存