2015-04-30 114 views
0

因此,我一直在研究一個Java應用程序,它應該讓人們使用帶有界面的程序運行他們的Minecraft服務器。當你運行一個shell腳本時,所有的輸出都放在窗口中,然後你可以寫入輸入。輸入然後由過程讀取並解釋。這使您可以使用子命令,如「開始」,「停止」,「幫助」,「操作」等。但是,我無法弄清楚如何將輸入發送到流程。閱讀到進程凍結控制檯

這是控制檯的樣子:

http://gyazo.com/cda6e7c25f9c450ca597587cadced745.png

我試過如下:

public void createConsoleInput(final InputStream inputStream /* Obtained via process.getInputStream() */) 
{ 
    final Thread consoleThread = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      final BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); 
      consoleInput.addActionListener(new ActionListener() 
      { 
       @Override 
       public void actionPerformed(ActionEvent e) 
       { 
        try 
        { 
         String cmd = consoleInput.getText(); 
         lastmessage = cmd; 

         System.out.println("» /" + cmd); 
         br.read(cmd.toCharArray()); 
         consoleInput.setText(""); 
        } 
        catch (IOException e1) 
        { 
         e1.printStackTrace(); 
        } 
       } 
      }); 
     } 
    }; 
    consoleThread.start(); 
} 

領域,這是我在上面的圖片中標記爲 「輸入」,加速時,將執行actionPerformed()方法。但是,它似乎凍結在線上:br.read(cmd.toCharArray());

它在外部死亡後解凍。它甚至不會執行System.out部分,直到之後被殺死。所以,我的問題是:我如何正確地做到這一點?

編輯:

將其更改爲一個作家,不再掛起後。相反,它只是打印控制檯消息:

public void createConsoleInput(final BufferedWriter writer) 
{ 
    final Thread consoleThread = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      consoleInput.addActionListener(new ActionListener() 
      { 
       @Override 
       public void actionPerformed(ActionEvent e) 
       { 
        try 
        { 
         String cmd = consoleInput.getText(); 
         lastmessage = cmd; 

         System.out.println("» /" + cmd); 
         writer.write(cmd); 
         consoleInput.setText(""); 
        } 
        catch (IOException e1) 
        { 
         e1.printStackTrace(); 
        } 
       } 
      }); 
     } 
    }; 
    consoleThread.start(); 
} 

作者是這樣訪問:

BufferedWriter stdin = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

編輯2:我已經試過用代碼亂搞,但似乎沒有任何修復它。我覺得我只是寫錯了一個字。

+0

的'InputStream'是你可以*從*閱讀 - 這是從*你*角度輸入(但它是從另一個進程的角度輸出) – immibis

+0

@immibis:啊,謝謝。查看我的編輯。 – ColonelHedgehog

+0

如果你在命令後面寫了一個換行符,它會工作嗎? – immibis

回答

0

固定!我只需要衝洗作家。請看:

public void createConsoleInput(final BufferedWriter writer) 
{ 
    final Thread consoleThread = new Thread() 
    { 
     @Override 
     public void run() 
     { 
      consoleInput.addActionListener(new ActionListener() 
      { 
       @Override 
       public void actionPerformed(ActionEvent action) 
       { 
        try 
        { 
         String cmd = consoleInput.getText(); 
         lastmessage = cmd; 

         System.out.println("» /" + cmd); 
         writer.write(cmd + "\n"); 
         consoleInput.setText(""); 
         writer.flush(); 
        } 
        catch (IOException e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      }); 
     } 
    }; 
    consoleThread.start(); 
}