簡體   English   中英

輸入命令並獲取命令提示符完整輸出到Java中的textarea

[英]Give input command and Get Command Prompt complete Output to textarea In Java

我無法讀取該程序的完整輸出,有時它會掛起接口並且無法完全編譯。 在netbeans的輸出控制台中,它顯示完整的輸出,但不在jtextarea中顯示。

幫助我先在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);
        }

我看到的問題是這個。 您正在嘗試執行一個程序,但是直到完成執行之后,您才從該程序的輸出流(即Process的getInputStream())中進行讀取。 因此,如果您的subProcess恰好有很多輸出並且耗盡了緩沖區,那么subProcess將被阻塞。

因此,要解決您的問題,您需要在子流程仍在執行時絕對讀取輸入流和錯誤流,以免子流程被阻塞。 您可以使用阻塞IO(這意味着您需要單獨的線程來服務輸出流和錯誤流),也可以使用非阻塞IO(可以使用1個線程來連續監視輸出流和錯誤流以讀取數據)。

java.lang.Process上的Java文檔說

由於某些本機平台僅為標准輸入和輸出流提供了有限的緩沖區大小,因此未能及時寫入子進程的輸入流或讀取子進程的輸出流可能導致子進程阻塞,甚至死鎖。

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM