2012-08-22 56 views
2

爲了理解這種情況,我試着描述一下我想實現的: 我想創建一個啓動另一個java程序的java程序(一個Minecraft服務器),監視它的輸出,並相應地發送命令給它的輸入。當從java代碼運行jar程序時,jar程序的gui凍結在直接輸入上

我能夠從我的代碼啓動jar程序,我也能夠爲它編寫一個輸出監聽器,它目前只能將jar程序的輸出打印到控制檯。

我從我的代碼運行的jar程序有一個文本輸出面板,它顯示消息和一個輸入字段(textarea)我可以給命令的GUI。我的問題是,當我開始我的代碼,它啓動程序一切正常,直到我想直接寫入程序的輸入字段。如果我在輸入字段中輸入任何字母,則gui會凍結。

我該怎麼做?

這裏是我的代碼:

public static void main(String[] args) { 
    try { 
     System.out.println("Starting."); 
     Runtime rt = Runtime.getRuntime(); 
     Process proc = rt.exec("java -jar \"D:\\Program Files\\mc\\minecraft_server.jar\""); 
     // output both stdout and stderr data from proc to stdout of this process 
     StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream()); 
     StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream()); 
     errorGobbler.start(); 
     outputGobbler.start(); 

    } catch (Exception e) { 
     System.out.println(e.getMessage()); 
    } 
} 

輸出讀者:

public class StreamGobbler extends Thread { 
    InputStream is; 

    // reads everything from is until empty. 
    StreamGobbler(InputStream is) { 
     this.is = is; 
    } 

    public void run() { 
     try { 
      InputStreamReader isr = new InputStreamReader(is); 
      BufferedReader br = new BufferedReader(isr); 
      String line = null; 
      while ((line = br.readLine()) != null) 
       System.out.println(line); 
     } catch (IOException ioe) { 
      ioe.printStackTrace(); 
     } 
    } 
} 

提前感謝! :)

+0

爲了簡單起見,合併'out'&'err'流。實際上在那裏看到兩條溪流,我愚蠢地認爲狼吞虎嚥正在消耗輸出流,但當然它正在讀'錯誤'。 ***消費'out'流!***並通過[exec info鏈接的文章。頁面](http://stackoverflow.com/tags/runtime.exec/info)&執行所有其他建議。 –

+0

感謝您的建議,但問題依然存在:爲什麼gui會凍結?我只是在運行這個程序。我沒有鍛鍊任何東西...... – Angezerus

+0

很好,你實施我的建議和編輯問題..哦,等等,你沒有打擾。 *「問題依然存在:」*好吧,你是一個有着明確動機去解決問題的人,所以我會接受評論1中推薦的那些東西。祝你好運! –

回答

1

首先,而是採用了流火雞,只是繼承進程的IO:

final ProcessBuilder p1 = new ProcessBuilder(command).inheritIO(); 
p1.start(); 

如果你不關心標準輸入/輸出,用此來引導一切NUL(窗口版本/ dev/null):

p1.redirectInput(Redirect.from(new File("NUL"))).redirectOutput(Redirect.to(new File("NUL"))) 
         .redirectError(Redirect.to(new File("NUL"))); 

程序是否仍然崩潰?