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

浏览:45日期:2024-02-21
如何解决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();}解决方法

我正在执行一个命令,该命令向我返回文件的修订号;’文档名称’。但是,如果执行命令时遇到问题,则应用程序将挂断。我该怎么做才能避免这种情况?请在下面找到我的代码。

String cmd= 'cmd /C si viewhistory --fields=revision --project='+fileName; Process p = Runtime.getRuntime().exec(cmd) ; BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = null; while ((line = in.readLine()) != null) { System.out.println(line); }} catch (Exception e) { e.printStackTrace(); }

相关文章: