2012-09-14 30 views
1

我想提出一個計劃,將不得不運行從內右側的Java編譯器和JVM的能力,它(不要問我爲什麼,我重新發明輪子,如果你的回覆,並沒有幫助,保存它,我已經非常沮喪地花費幾個小時解決方案,不工作!)。到目前爲止,我已經處理了它跟蹤我的文本框,每當我輸入的東西,用java啓動,這樣它實際上將包裹起來的文字,並給它像這樣運行:控制檯輸出捕獲可用的解決方案 - java的

if(String.valueOf(object).startsWith("java")){ 
     try{ 
      Runtime runtime = Runtime.getRuntime(); 
      Process process = runtime.exec(String.valueOf(object)); 
     } 
     catch(Exception e){gsc.mainWindow.printf("error");} 

考慮gsc.mainWindow.printf(...);我輸出到一個JTextArea在JFrame中。

我現在已經成功的運行了命令,但任何故障,我應該能夠直接打印到我的輸出。我知道這已經被回答了很多次,閱讀了10種方法來做到這一點,但是他們都沒有工作,或者是可以理解的,我可以運行它。我需要的代碼很簡單,因爲它必須輸出在默認系統的控制檯(cmd,終端)中寫入的過程,然後停止(我認爲這可以是一個方法調用)。我對這種東西非常不滿,即使是多線程解決方案也能滿足我的需求,真的沒什麼太專業的,我只需要它就可以工作。你需要的任何信息,請去! 在此先感謝! :)

+0

所以你要啓動一個外部程序,捕捉它是在應用程序中使用的輸出,並同時打印輸出到標準輸出? –

+0

我要外只啓動Java虛擬機和Java編譯器,捕捉我的應用程序的輸出,我不介意,如果它在標準輸出打印,雖然我並不需要它! (如果我必須打印到兩者,那就這樣吧,這是我的煩惱中最少的) –

+0

我很困惑什麼不適合你。你是否從'process.getInputStream()'讀取了啓動命令輸出的內容? –

回答

4

我不知道你,如果你想閱讀,但你知道,在Java世界中,你應該總是尋找實現自己之前的解決方案。常見問題的解決方案大多數時間來自Apache Commons或其他Apache項目。說除了你的解決方案以外的所有東西都不行,或者對你來說太複雜了,你只會花費你的時間和金錢(最終還是你的工作)。

Apache Commons Exec是你需要更快,更容易解決你的問題是什麼。

---- ----編輯

下面是如何捕捉子進程的輸出一些代碼。只是有它的一類,在PumpStreamHandler

DefaultExecutor exec = new DefaultExecutor(); 
PumpStreamHandler streamHandler = new PumpStreamHandler(); 
exec.setStreamHandler(streamHandler); 

CommandLine commandline = CommandLine.parse(command); //where command is your command line 
exec.execute(commandline); 

----編輯2 ----

這裏是你想使用OutputStream捕捉消息的複製粘貼的解決方案:

public abstract class LogOutputStream extends OutputStream { 

protected static final String LINE_SEPERATOR = System.getProperty("line.separator"); 
public static final int DEFAULT_BUFFER_LENGTH = 2048; 

protected boolean hasBeenClosed = false; 
protected byte[] buf; 
protected int count; 
private int bufLength; 

public LogOutputStream() { 
    bufLength = DEFAULT_BUFFER_LENGTH; 
    buf = new byte[DEFAULT_BUFFER_LENGTH]; 
    count = 0; 
} 

public void close() { 
    flush(); 
    hasBeenClosed = true; 
} 

public void write(final int b) throws IOException { 
    if (hasBeenClosed) { 
     throw new IOException("The stream has been closed."); 
    } 
    if (b == 0) { 
     return; 
    } 
    if (count == bufLength) { 
     final int newBufLength = bufLength + DEFAULT_BUFFER_LENGTH; 
     final byte[] newBuf = new byte[newBufLength]; 

     System.arraycopy(buf, 0, newBuf, 0, bufLength); 

     buf = newBuf; 
     bufLength = newBufLength; 
    } 
    buf[count] = (byte) b; 
    count++; 
} 

public void flush() { 
    if (count == 0) { 
     return; 
    } 
    if (count == LINE_SEPERATOR.length()) { 
     if (((char) buf[0]) == LINE_SEPERATOR.charAt(0) 
       && ((count == 1) || 
       ((count == 2) && ((char) buf[1]) == LINE_SEPERATOR.charAt(1)))) { 
      reset(); 
      return; 
     } 
    } 
    final byte[] theBytes = new byte[count]; 
    System.arraycopy(buf, 0, theBytes, 0, count); 
    log(new String(theBytes)); 
    reset(); 
} 


private void reset() { 
    count = 0; 
} 

public abstract void log(String message); 
} 

然後,只需創建它的子類,使用更新UI的代碼實現public void log(String message),就完成了。

+0

我不喜歡外部軟件包,但最近我遇到了很多實現功能的問題,這看起來好像是一個好主意。我會給它一張支票並通知你!謝謝! :) –

+0

你能在這裏用一些代碼支持我嗎?試圖找到如何做到這一點,似乎是一個非常好的包來解決我的問題,但是我無法獲得一個可用的示例來構建我的代碼! :S –

+0

這裏是代碼 –

相關問題