Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读取进程冻结控制台_Java_Shell_Process_Java Threads - Fatal编程技术网

Java 读取进程冻结控制台

Java 读取进程冻结控制台,java,shell,process,java-threads,Java,Shell,Process,Java Threads,所以,我一直在开发一个Java应用程序,它应该让人们使用一个带有接口的程序来运行Minecraft服务器。当您运行shell脚本时,所有输出都放在窗口中,然后您就可以编写输入了。然后进程读取输入并对其进行解释。这允许您使用子命令,如“开始”、“停止”、“帮助”、“操作”等。但是,我不知道如何将输入发送到流程 这是控制台的外观: 我尝试了以下方法: public void createConsoleInput(final InputStream inputStream /* Obtained v

所以,我一直在开发一个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();
}
上图中我标记为“Input”的字段在加速时将执行actionPerformed()方法。但是,它似乎冻结在以下行:
br.read(cmd.tocharray())

在外部终止进程后,它将解冻。在它被杀死之前,它甚至不做系统输出部分。所以,我的问题是:我如何正确地做到这一点

编辑:

将其更改为writer后,它不再挂起。相反,它只打印控制台消息:

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=newbufferedwriter(newoutputstreamwriter(p.getOutputStream())


编辑2:我试着把代码弄乱了,但似乎没有什么能解决它。我觉得我写错了流。

修复!我只需要冲洗一下作者。看一看:

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();
}

InputStream
是您可以读取的东西-它是从您的角度进行的输入(但它是从另一个进程的角度进行的输出)@immibis:啊,谢谢。查看我的编辑。如果在命令后写一个换行符是否有效?@immibis:Nope。将其更改为
writer.write(cmd+“\n”)似乎没有改变任何东西。