因此,我一直在研究一个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