2

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

提前致谢!:)

4

1 回答 1

1

首先,不要使用stream gobbler,而是继承进程的io:

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

如果您不关心标准输入/输出,请使用它来将所有内容定向到 NUL(/dev/null 的 Windows 版本):

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

程序是否仍然崩溃?

于 2012-09-16T00:52:27.570 回答