从java代码运行jar程序时,jar程序';s的gui在直接输入时冻结

从java代码运行jar程序时,jar程序';s的gui在直接输入时冻结,java,runtime.exec,Java,Runtime.exec,为了了解情况,我试着描述一下我正在努力实现的目标: 我想创建一个java程序来启动另一个java程序(minecraft服务器),监视它的输出,并相应地向它的输入发送命令 我可以从我的代码中启动jar程序,我还可以为它编写一个输出监听器,目前只将jar程序的输出打印到控制台 我在代码中运行的jar程序有一个gui,其中有一个文本输出面板,显示消息,还有一个输入字段(textarea),我可以在其中发出命令。我的问题是,当我启动代码并启动程序时,一切正常,直到我想直接写入程序的输入字段。如果我在输

为了了解情况,我试着描述一下我正在努力实现的目标: 我想创建一个java程序来启动另一个java程序(minecraft服务器),监视它的输出,并相应地向它的输入发送命令

我可以从我的代码中启动jar程序,我还可以为它编写一个输出监听器,目前只将jar程序的输出打印到控制台

我在代码中运行的jar程序有一个gui,其中有一个文本输出面板,显示消息,还有一个输入字段(textarea),我可以在其中发出命令。我的问题是,当我启动代码并启动程序时,一切正常,直到我想直接写入程序的输入字段。如果我在输入字段中键入任何字母,gui将冻结

我错了什么

这是我的密码:

public static void main(String[] args) {
    try {
        System.out.println("Starting.");
        Runtime rt = Runtime.getRuntime();
        Process proc = rt.exec("java -jar \"D:\\Program Files\\mc\\minecraft_server.jar\"");
        // output both stdout and stderr data from proc to stdout of this process
        StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream());
        StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream());
        errorGobbler.start();
        outputGobbler.start();

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}
输出读取器:

public class StreamGobbler extends Thread {
    InputStream is;

    // reads everything from is until empty.
    StreamGobbler(InputStream is) {
        this.is = is;
    }

    public void run() {
        try {
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            while ((line = br.readLine()) != null)
                System.out.println(line);
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

提前感谢!:)

首先,不要使用流gobbler,只需继承进程的io即可:

final ProcessBuilder p1 = new ProcessBuilder(command).inheritIO();
p1.start();
如果您不关心stdin/out,请使用此命令将所有内容定向到NUL(windows版本的/dev/null):


程序仍然崩溃吗?

为了简单起见,将
流合并到
之外
错误
流中。实际上在那里看到了两条流,我愚蠢地认为狼吞虎咽者正在消耗这两条输出流,但它当然是在
中读取
err
&
。消耗
out
流!并浏览链接文章&实现所有其他建议。感谢您的建议,但问题仍然是:gui为什么会冻结?我只是在运行这个程序。我不是在磨炼任何东西…很高兴你能实施我的建议并编辑这个问题。。哦,等等,你没有麻烦。问题仍然是:“好吧,你是一个有明确动机去解决它的人,所以我会继续评论1中推荐的那些事情。”。祝你好运可以我把溪流汇合在一起。这显然与问题无关,它只是一个优化。我不明白的是,我为什么要吃外卖?当我将数据挖掘到一个读卡器中并试图读取它时,什么都没有发生,但是当我读取“输入流”(从jar的角度看,似乎是输出流)时,一切都正常。我收到了jar发送的所有消息。我会实现其他事情,但我想从这个开始。“我会实现其他事情,但我想从这个开始。”从实现“其他事情”开始,因为,正如我在链接页面中所写的。。“这篇文章是检查流程是否失败的第一件事。实现所有提示…”
p1.redirectInput(Redirect.from(new File("NUL"))).redirectOutput(Redirect.to(new File("NUL")))
                        .redirectError(Redirect.to(new File("NUL")));