2

状況を理解するために、私が達成しようとしていることを説明しようとしています: 別の Java プログラム (Minecraft サーバー) を起動し、その出力を監視し、それに応じて入力にコマンドを送信する Java プログラムを作成したいと思います。

コードから jar プログラムを開始することができました。また、現在は jar プログラムの出力をコンソールに出力するだけの出力リスナーを作成することもできました。

コードから実行している jar プログラムには、メッセージを表示するテキスト出力パネルと、コマンドを入力できる入力フィールド (テキストエリア) を備えた GUI があります。私の問題は、コードを開始してプログラムを開始すると、プログラムの入力フィールドに直接書き込むまで、すべてが正常に機能することです。入力フィールドに文字を入力すると、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

まず、ストリーム ゴブラーを使用する代わりに、プロセスの io を継承します。

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

stdin/out を気にしない場合は、これを使用してすべてを 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 に答える