2012-03-26 109 views
2

我試圖打開一個終端控制檯,並能夠讀/寫命令。從Java進程讀取InputStream

我讀到這樣一些問題: Java Process with Input/Output Stream

與已能夠構建打開的終端,並通過命令控制檯,並打印出結果後面一個小應用程序,它可以與任何系統COMAND像瀏覽文件夾運行良好,刪除文件和類似的東西。

我遇到的問題是我需要從該控制檯加載另一個Java程序並讀取其輸出,但該程序使用java.util.logging.Logger發送其大部分輸出,由於某種原因,我的啓動應用程序可以'閱讀記錄器打印的內容。

基本上我試圖建立像另一個Java應用程序的包裝,因爲我想與它交互,但無法修改它。

感謝您的幫助。

編輯

下面是代碼,但正如我所說的它工作的事情,在「正常」標準輸出,而不是輸出記錄儀打印到控制檯的基本上是從另一個問題採取的,也。

package launcher; 

import java.io.*; 
import java.util.Scanner; 

public class Launcher { 

    public static void main(String[] args) throws IOException { 

     String line; 
     Scanner scan = new Scanner(System.in); 

     Process process = Runtime.getRuntime().exec("/bin/bash"); 

     OutputStream stdin = process.getOutputStream(); 
     InputStream stderr = process.getErrorStream(); 
     InputStream stdout = process.getInputStream(); 

     BufferedReader reader = new BufferedReader(new InputStreamReader(stdout)); 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin)); 

     while (scan.hasNext()) { 
      String input = scan.nextLine(); 
      if (input.trim().equals("exit")) { 

       writer.write("exit\n"); 
      } else { 
       writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n"); 
      } 
      writer.flush(); 

      line = reader.readLine(); 
      while (line != null && !line.trim().equals("--EOF--")) { 
       System.out.println("Stdout: " + line); 
       line = reader.readLine(); 
      } 
      if (line == null) { 
       break; 
      } 
     } 

    } 
} 
+0

你還沒有給我們太多的東西去我們這裏,我們基本上猜測...如果記錄器打印到STD OUT,那麼這應該工作,但它可能會記錄到文件,或打印到STD ERROR ,或者做這些事情的混合物。 – Jon 2012-03-26 09:00:07

回答

1

沒有看到任何代碼/配置,我猜想,無論是記錄器配置爲寫入到stderr(System.err的),你就只能讀取標準輸出(System.out的),否則記錄儀配置爲寫入文件。

+1

你是完全正確的,我應該在凌晨4點停止這樣做。非常感謝。 – josephfley 2012-03-26 09:07:35

0

每DTY的回答,我覺得默認的java.util.logging使用標準錯誤,所以你應該stderr重定向到標準輸出,這樣的:

ProcessBuilder builder = new ProcessBuilder("ls", "-l"); // or whatever your command is 
builder.redirectErrorStream(true); 
Process proc = builder.start(); 

FWIW以我的經驗,你會更好試圖通過在你自己的程序中啓動它的main方法來使用另一個Java程序,而不是試圖與輸入/輸出流等搏鬥,但這取決於其他程序的功能。

+0

是的問題是我只讀標準輸出,默認情況下,記錄器將其INFO放置到標準錯誤。 – josephfley 2012-03-26 09:08:52