2013-07-18 55 views
0

我試圖從由Java腳本啓動的.exe進程的控制檯獲取輸入。控制檯窗口中沒有任何內容出現,並且在程序終止之前程序不會讀取任何內容。Java:直到程序關閉才從Process對象輸入

blServ = new ProcessBuilder(blPath + "Blockland.exe", "ptlaaxobimwroe", "-dedicated", "-port " + port, "-profilepath " + blPath.substring(0, blPath.length() - 1)).start(); 
System.out.println("Attempting to start server...\n" + blPath); 
consoleIn = new BufferedReader(new InputStreamReader(blServ.getInputStream())); 

'blServ'是一個Process對象。是的,該計劃正在成功啓動。

public void blStreamConsole() //called once every 500 milliseconds 
{ 
    String lineStr = ""; 
    String line = ""; 
    int lines = 0; 
    try 
    { 
     if (consoleIn != null) 
     { 
      while ((line = consoleIn.readLine()) != null) 
      { 
       //if (!line.equals("%")); 
       //{ 
        lineStr += line + wordSym; 
        lines++; 
       //} 
      } 
     } 
    } 
    catch (IOException e) 
    { 
     netOut.println("notify" + wordSym + "ERROR: An I/O exception occured when trying to get data from the remote console. Some lines may not be displayed."); 
    } 
    if (!lineStr.equals("") && !(lineStr == null)) 
     netOut.println("streamconsole" + wordSym + lines + wordSym + lineStr); 
} 

基本上,這種方法認爲,如果有更多的輸入在consoleIn對象等待,並且如果存在,其追加每它具有另一個字符串線,和其它的字符串被髮送到客戶端。不幸的是,當Blockland.exe關閉時,它全部發送到一個大塊。對於縮進問題感到抱歉。 Stackoverflow編輯器重新安排了所有的代碼。

回答

0

在我看來,有兩種可能的位置:

  • readLine塊,等待輸入(並且不返回null如你期望的那樣)。您可以使用BufferedReader,而是using the InputStream

  • 輸出流不沖水,直到所有的輸入已被寫入能夠通過解決它。嘗試把一個flush有:

    還要注意的是,如果lineStrnull,你會得到一個NullPointerException爲你的代碼目前是(你需要換你的條件),但它甚至不能null

    if (!lineStr.isEmpty()) 
    { 
        netOut.println("streamconsole" + wordSym + lines + wordSym + lineStr); 
        netOut.flush(); 
    } 
    
0
while ((line = consoleIn.readLine()) != null){ 
    lineStr += line + wordSym; 
    lines++; 
} 

與這段代碼的問題是,它會繼續運行,直到程序退出。它會將每行添加到lineStr,直到程序退出(當console.readLine()null)。然後打印整個lineStr,包含整個控制檯。

如果要連續打印輸出,你需要立刻打印:

while ((line = consoleIn.readLine()) != null){ 
    netOut.println(line); 
} 

您可以在一個單獨的線程中運行它,並能持續輸出控制檯輸出流,直到程序退出。