2013-03-23 91 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)(或繼承)時,您可以避免這種情況。

相關問題