因此,我一直在研究一個Java應用程序,它應該讓人們使用帶有界面的程序運行他們的Minecraft服務器。當你運行一個shell腳本時,所有的輸出都放在窗口中,然後你可以寫入輸入。輸入然後由過程讀取並解釋。這使您可以使用子命令,如「開始」,「停止」,「幫助」,「操作」等。但是,我無法弄清楚如何將輸入發送到流程。閱讀到進程凍結控制檯
這是控制檯的樣子:
我試過如下:
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:我已經試過用代碼亂搞,但似乎沒有任何修復它。我覺得我只是寫錯了一個字。
的'InputStream'是你可以*從*閱讀 - 這是從*你*角度輸入(但它是從另一個進程的角度輸出) – immibis
@immibis:啊,謝謝。查看我的編輯。 – ColonelHedgehog
如果你在命令後面寫了一個換行符,它會工作嗎? – immibis