2012-03-26 3 views
2

터미널 콘솔을 열고 명령을 읽고 쓸 수 있습니다. Java 프로세스에서 InputStream을 읽는 중

내가 좋아하는 몇 가지 질문을 읽어 그와 Java Process with Input/Output Stream

터미널을 열고 콘솔에 명령을 전달하고 결과를 다시 인쇄 작은 응용 프로그램 수 빌드되었다, 그것은 검색 폴더와 같은 모든 시스템 COMAND 잘 작동 , 파일을 삭제하고 그런 것들을.

내가 가진 문제는 그 콘솔에서 다른 자바 프로그램을로드하고 출력을 읽어야하지만 그 프로그램은 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

답변

1

코드/설정을 보지 않고, 나도 로거는 표준 에러 (System.err에)에 기록하도록 구성되어 있고 만 (System.out에) 표준 출력을 읽고, 또는 다른 로거는 추측 것 파일에 기록하도록 구성됩니다.

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

FWIW을, 당신이 시도 해제 좋을 것 : 당신은 표준 오류 리디렉션해야하므로 DTY의 대답은 당

+1

당신은 완전히 옳았습니다, 그리고 나는 이것을 4am에서 중단해야합니다. 고마워. – josephfley

0

, 나는 기본 java.util.logging의에 의해 생각은 다음과 같이 표준 출력을, 표준 에러를 사용 자신의 프로그램에서 main 메소드를 시작하여 다른 Java 프로그램을 사용하십시오. 입/출력 스트림 등과 씨름하려고 시도하는 것보다는 다른 프로그램이하는 일에 달려 있습니다.

+0

네, 문제는 제가 stdout을 읽었을 뿐이었고, 기본적으로 Logger는 그 정보를 stderr로 보내고있었습니다. – josephfley

관련 문제