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

时间:2012-08-22 12:51:18

标签: java runtime.exec

为了理解这种情况,我试着描述一下我想要实现的目标: 我想创建一个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();
        }
    }
}

提前致谢! :)

1 个答案:

答案 0 :(得分:1)

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

final ProcessBuilder p1 = new ProcessBuilder(command).inheritIO();
p1.start();

如果您不关心stdin / out,请使用此命令将所有内容指向NUL(Windows版本的/ dev / null):

p1.redirectInput(Redirect.from(new File("NUL"))).redirectOutput(Redirect.to(new File("NUL")))
                        .redirectError(Redirect.to(new File("NUL")));

程序是否仍然崩溃?