2011-08-16 5 views
1

자바에 관해서는 초보자입니다. 나는 java에서 시작된 프로세스에서 stdout을 읽고 싶었다."BufferedReader.ready"vs. "while (BufferedReader.readLine()! = null)"

Runtime rt = Runtime.getRuntime(); 
    Process proc = rt.exec(args); 
    BufferedReader br = new BufferedReader(
     new InputStreamReader(proc.getInputStream())); 
    while(br.ready()){ 
      System.out.println(br.readLine()); 
    } 

그러나,이 코드는 (내가 리눅스 오전 BTW, 오픈 JDK 1.6) 프로세스가 (예를 들어, LS)을 생성하도록되어있는 출력을 인쇄하지 않습니다

: 나는 구글 검색시 다음과 같은 코드를 가지고 I가 while 루프를 변경하는 경우

그러나 :

String line; 
    while((line = br.readLine())!=null){ 
      System.out.println(line); 
    } 

그것은 기대 작품으로.

이전 코드의 문제점은 무엇입니까? 자바 API 의사가 말한 것에 따르면, 나는 그들이 비슷하다고 생각했다.

+0

실제로 의도 된 코드를 반영하기 위해 첫 번째 코드 블록을 편집했습니다. – Santanu

답변

5

이전 루프에서는 준비 상태를 반복하면서 스트림의 바이트를 읽지 않습니다.

+0

br.ready()가 항상 true를 반환하기 때문에 첫 번째 루프가 무한하다는 것을 의미합니까? 코드의 첫 번째 조각에서 String line = null 및 while 루프를 선언하면 while (line == br.ready()) {System.out.println (line); if (line == null) break; } 맞습니까? –

+0

루프가 무한 상태로 들어갈 확률이 높습니다. 그러나,'br.ready()'의 첫 번째 호출이'false'를 반환하면, 루프는 종료 될 것입니다. 나는 그것이 여기의 경우라고 믿는다. 또한, 표시된 것처럼'String'을 부울로 동일시 할 수 없습니다. 'ready()'는'boolean'을 반환한다는 것을 기억하십시오. – adarshr

+0

첫 번째 루프에서'line'이 어디에서 왔는지도 명확하지 않습니다. –

0

ready() 테스트에 도달하면 명령은 아직 출력을 생성하지 않았고 false을 반환하고 루프를 즉시 종료합니다.

두 번째 코드는 readLine() 호출이 전체 행을 읽을 때까지 블록하기 때문에 작동합니다. 추가 제어가 없으면 명령에 의해 생성 된 출력의 양과 완료까지 걸리는 시간에 따라 달라 지므로 이러한 코드의 출력은 예측할 수 없습니다.

이것은 매우 간단한 시나리오이므로 대부분의 경우 작동하지만 일반적으로 적용 할 수있는 해결책은 아닙니다.

관련 문제