2012-08-03 5 views
3
public static void executeCommand(String cmd) { 
    try { 
     Process process = Runtime.getRuntime().exec(cmd, null, 
       new File("/usr/hadoop-0.20.2/")); 
     InputStream stdin = process.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(stdin); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 
     System.out.println("<output></output>"); 
     while ((line = br.readLine()) != null) 
      System.out.println(line); 
     InputStreamReader esr = new InputStreamReader(
       process.getErrorStream()); 
     BufferedReader errorReader = new BufferedReader(esr); 
     String lineError; 
     while ((lineError = errorReader.readLine()) != null) 
      System.out.println(lineError); 
     process.waitFor(); 
     System.out.println(""); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

다음은 'cmd'라는 명령을 실행하기위한 코드입니다. 하지만이 코드를 통해 실시간 결과물을 얻을 수는 없습니다. 명령이 완료되면 출력이 나옵니다. 나는 실시간 출력을 원한다. 이것을 할 수있는 방법이 있습니까?내 Runtime.getRuntime()의 실시간 출력을 원합니다. exec()

+0

실시간 출력 대 명령 실행 시점을 명확하게 설명해주십시오. 'ls'가 완성 코드를 생성하는 목록과 같은 뜻입니까? – Edmon

답변

3

설명하는 문제는 사용자가 호출 한 응용 프로그램 때문에 발생했을 가능성이 큽니다. 많은 응용 프로그램은 터미널에 연결될 때 버퍼되지 않은 I/O를 사용하지만 파이프에 연결될 때는 I/O를 버퍼링합니다. 그러므로 여러분의 cmd은 그 출력을 작은 비트 단위로 쓰지 않고 대신 큰 단위로 출력하기로 결정할 수 있습니다. 적절한 수정은 명령을 조정하여 적절한 시간에 출력을 플러시하는 것입니다. 자바 측에서 할 수있는 일은 거의 없습니다. this answer을 참조하십시오.

0

출력 처리를위한 스레드가 있어야한다고 생각합니다.

당신의 출력을 읽는 동안

마지막으로 실행 cmd를, 내가 wvdial 명령을 사용하려고 할 때 (우리가 그것을 중지 할 때까지이 wvdial 완료되지 않음), 내가 스레드를 필요로 먼저 시도해야 wvdial

관련 문제