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

4

1 回答 1

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();
}
于 2015-04-30T22:57:28.337 回答