所以,我一直在开发一个 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:我试过弄乱代码,但似乎没有什么能解决它。我觉得我只是在写错误的流。