2013-03-23 92 views
1

我试图在Java中记录应用程序的所有输出,由于某种原因它只捕获前两行,我知道应用程序输出比这更多我的代码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(); 

我甚至没有看到“检查错误流”在我的控制台。

+0

其他行可能会去errorstream! – 2013-03-23 20:42:10

回答

0

Minecraft服务器中的前两行转到STDOUT(在bukkit,tekkit和vanilla上测试),但其余的转到STDERR是因为什么原因。 errorStream你的应用程序没有做任何事情。您可以尝试使用重定向功能:

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

让我知道这是否有效,因为这可能是一个纯粹的伎俩。

+0

非常感谢你的增加它,但它不工作仍然看到我的更新 – 2013-03-23 20:47:37

+0

编辑。请参阅@ A4L的答案。他比我好。 – 2013-03-23 20:53:29

+0

嗯,你的伎俩在Windows上工作:) – 2013-03-23 21:05:19

2

我不认为有外部需要,从输出流块读取,直到有一些数据可用,并且如果子进程结束,你会得到一个null和内部将打破。您也可以使用ProcessBuilderredirectErrorStream(true)stderr重定向到stdout,这样您只需在一个循环中即可捕获它们。

1

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

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

相关问题