2013-12-18 42 views
0

我無法讀取程序的完整輸出,有時會掛起接口並且不能完全編譯。 在netbeans的輸出控制檯中,它顯示完整的輸出,但不顯示在jtextarea中。給出輸入命令並獲取命令提示完成輸出到textarea在Java中

幫我出來先在cmd執行命令(命令提示符),然後從cmd讀取輸出到textarea。

在cmd中,該命令可以快速執行並顯示完整結果。但我不知道如何從cmd得到結果。

這裏是我的代碼:

String line; 
String [] cmds={"xyz.exe","--version"}; 
try{ 
Process p =Runtime.getRuntime().exec(cmds);     
    p.waitFor(); 
    int val=p.exitValue(); 
    if(val==0) 
    { 
     b1.setForeground(Color.green);        
     InputStream ins = p.getInputStream(); 
     InputStreamReader insr = new InputStreamReader(ins); 
     BufferedReader br = new BufferedReader(insr); 
     while ((line = br.readLine()) != null) { 
      System.out.println(line); 
      t1.setText(line); 
     } 
    } else if(val==1) 
    { 
     b1.setForeground(Color.red); 
     InputStream error = p.getErrorStream(); 
     InputStreamReader isrerror = new InputStreamReader(error); 
     BufferedReader bre = new BufferedReader(isrerror); 
     while ((line = bre.readLine()) != null) { 
      t1.setText(line); 

     } 
    } 
    } catch(IOException e){ 
     System.out.println("error"); 
     e.printStackTrace(); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex); 
     } 
+0

你的是在您的長時間運行的進程正在阻塞Swing事件線程的線程問題。在Swing和線程上搜索。這是一個常見問題,您發現的結果將直接適用於您的問題。 –

+0

請您在本代碼中建議我一些相關的閱讀或問題。 – user3078848

+0

如果我正確理解這個問題,它很像我在這個線程中發現的:http://stackoverflow.com/questions/20600721/display-indeterminate-jprogressbar-while-batch-file-runs Trashgod提供了一個如何正確執行此操作的最佳示例。再次,這是假設我正確理解你的問題 – DerStrom8

回答

0

我看到的問題是這樣的。您正在嘗試執行程序,但是您沒有從程序的輸出流(即Process的getInputStream())讀取,直到它完成執行。所以如果你的subProcess碰巧有很多的輸出並且耗盡了緩衝區,那麼subProcess就會被阻塞。

因此,爲了解決您的問題,您需要在子進程仍在執行時絕對讀取inputstream和errorstream,以避免子進程被阻塞。您可以使用阻塞IO,這意味着您需要單獨的線程來服務outputstream和errorstream或非阻塞IO,您可以使用1個線程連續監視outputstream & errorstream以讀取數據。

Java文檔上java.lang.Process中說

由於一些本地平臺只提供標準輸入和輸出流有限的緩衝區大小,沒有及時寫輸入流或讀取子進程的輸出流可能會導致子進程阻塞,甚至死鎖。

import java.io.*; 
import java.nio.channels.*; 
import java.nio.*; 

public static void nioExecute() throws Exception { 
    Process p = Runtime.getRuntime().exec("javac"); 
    ReadableByteChannel stdoutChannel = Channels.newChannel(p.getInputStream()); 
    ReadableByteChannel stderrChannel = Channels.newChannel(p.getErrorStream()); 
    ByteBuffer buffer = ByteBuffer.allocate(1000); 

    StringBuilder stdOut = new StringBuilder(); 
    StringBuilder stdErr = new StringBuilder(); 

    while(stdoutChannel.isOpen() || stderrChannel.isOpen()) { 
     buffer.clear(); 
     if(stderrChannel.isOpen()) { 
      int bytesRead = stderrChannel.read(buffer); 
      if(bytesRead>0) stdErr.append(new String(buffer.array(),0,bytesRead)); 
      if(bytesRead==-1) stderrChannel.close(); 
     } 
     buffer.clear(); 
     if(stdoutChannel.isOpen()) { 
      int bytesRead = stdoutChannel.read(buffer); 
      if(bytesRead>0) stdOut.append(new String(buffer.array(),0,bytesRead)); 
      if(bytesRead==-1) stdoutChannel.close(); 
     } 
     Thread.sleep(100); 
    } 

    if(stdOut.length()>0) System.out.println("STDOUT: " + stdOut); 
    if(stdErr.length()>0) System.out.println("STDERR: " + stdErr); 
} 
+0

你會給我一些線程的例子.. – user3078848

+0

我做了一個快速測試代碼供您參考。我選擇了Nonblocking IO(NIO),所以你可以在現有的線程中完成整個事情(可能不是最好的選擇:-))。此代碼顯示瞭如何將輸入和錯誤流讀入緩衝區,然後打印出整個事物。 – anonymous

+0

它對於小輸出工作正常,但對於大輸出仍然無法運行。 輸出大約1000字。 – user3078848