1

我正在尝试在java中记录所有应用程序的输出,由于某种原因它只捕获前两行我知道应用程序输出比这更多这是我的代码

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,从输出流块中读取直到有一些数据可用,如果子进程结束,你会得到 anull并且内部 while 会中断。您也可以使用ProcessBuilder's redirectErrorStream(true)重定向stderr到,stdout这样您就可以在一个循环中同时捕获它们。

于 2013-03-23T20:52:46.927 回答
1

您必须在其自己的线程中读取 stdout 和 stderr 流。否则你会遇到各种阻塞情况(取决于操作系统和输出模式)。

如果将错误流与输出流 ( redirectErrorStream(true)) 合并,则可以使用单个(附加)后台线程。redirectOutput(File)当您使用(或继承IO)时,您可以避免这种情况。

于 2013-03-23T20:54:06.707 回答
0

我的世界服务器中的前两行转到 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 回答