1

アプリケーションからのすべての出力をJavaでログに記録しようとしていますが、何らかの理由で、アプリケーションがこれよりもはるかに多く出力することがわかっている最初の2行のみをキャプチャしています。これが私のコードです

logOut = new BufferedWriter(new FileWriter("WebAdmin.log"));

        ProcessBuilder procBuild = new ProcessBuilder(
            "java", "-Xmx1G", "-Xms512M", "-jar", "TekkitServer\\Tekkit.jar", "nogui", "-nojline"
        );
        server = procBuild.start();

        inputStream = new BufferedReader(new InputStreamReader(server.getInputStream()));
        errorStream = new BufferedReader(new InputStreamReader(server.getErrorStream()));
        outputStream = new BufferedWriter(new OutputStreamWriter(server.getOutputStream()));

        String line = "";

        while(!shutdown){
            while((line = inputStream.readLine()) != null){
                logOut.write(line+"\r\n");
                logOut.flush();
                System.out.println(line);
            }
            System.out.println("checking error stream");
            while((line = errorStream.readLine()) != null){
                logOut.write(line+"\r\n");
                logOut.flush();
                System.out.println(line);
            }
        }

        System.out.println("Stoped Reading");
        logOut.close();
        server.destroy();

コンソールに「エラーストリームのチェック」が表示されません。

4

3 に答える 3

2

外側の while は必要ないと思います。出力ストリームから読み取り、データが利用可能になるまでブロックします。サブプロセスが終了するnullと、内側の while が壊れます。また、ProcessBuilderredirectErrorStream(true)を使用してリダイレクトstderrするstdoutこともできるため、1 つのループで両方をキャッチできます。

于 2013-03-23T20:52:46.927 に答える
1

独自のスレッドで stdout および stderr ストリームを読み取る必要があります。そうしないと、あらゆる種類のブロッキング状況が発生します (オペレーティング システムと出力パターンによって異なります)。

エラー ストリームを出力ストリーム ( redirectErrorStream(true)) とマージすると、1 つの (追加の) バックグラウンド スレッドと連携できます。redirectOutput(File)(または inheritIO)を使用すると、これを回避できます。

于 2013-03-23T20:54:06.707 に答える
0

Minecraftサーバーの最初の2行はSTDOUT(bukkit、tekkit、およびvanillaでテスト済み)に送られますが、残りは何らかの理由でSTDERRに送られます。アプリケーションはで何もしていませんerrorStream。これを行うことにより、リダイレクト機能の使用を試すことができます。

ProcessBuilder procBuild = new ProcessBuilder(
        "java", "-Xmx1G", "-Xms512M", "-jar", "TekkitServer\\Tekkit.jar",
        "nogui", "-nojline", "2>&1");

これはbashのみのトリックである可能性があるため、これが機能するかどうかをお知らせください。

于 2013-03-23T20:41:48.873 に答える