2012-10-30 4 views
2
import java.io.PrintStream; 
import java.util.Scanner; 
public class OutputTest 
{ 

    public static void main(String[] args) 
    { 
     Scanner scan = new Scanner(System.in); 
     PrintStream out = new PrintStream(System.out); 
     while(true) 
     { 
      int in = scan.nextInt(); 
      if(in == 0) break; 
      System.out.println(in*in); 
     } 
     out.flush(); 
    } 

} 

이 프로그램에서 행당 하나씩 숫자 목록을 가져오고 0에 도달하면 모든 사각형을 한 줄에 인쇄 할 것으로 기대합니다. 대신 사각형으로 입력하는 각 번호를 반향 출력합니다. 이상적으로Java : PrintStream 예기치 않게 자동 여백

, 실제로 라인을 포함 것 : 다음

System.setOut(out); 

과 (마지막에 플러시 제외) 일반적으로 내 프로그램의 나머지 부분을 쓰기를, 그러나 이것은 바로 메아리의 같은 결과를했습니다 .

그러나, 그러나 나는 System.setOutPrintWriter 때문에 할 수 없습니다하는 PrintWriterPrintStream 예상대로이 일을했던 변경하면 OutputStream를 확장하지 않습니다.

내가 예상 한대로 작동하지 않는 이유는 무엇입니까?

+2

무작위 코멘트 : Scanner.nextInt()는 위의 코드에서 잘 작동 할 수 있습니다. – jozefg

+0

코드의 들여 쓰기를 수정해야 할 수도 있습니다. – Sujay

+0

@jozefg 감사합니다. 그 방법이 존재한다는 사실을 잊어 버렸습니다. – Retsam

답변

2

모든 스트림 또는 작성기에서 flush()는 "flush 할 것이 있으면 flush"를 의미합니다. 수동으로 플러시되기 전에 어떤 스트림이나 기록기가 버퍼가 될 것으로 예상되는 동작이 아닙니다. 출력 스트림을 버퍼링 된 스트림으로 래핑 할 수 있지만 지정한 버퍼 크기가 가득 차면 플러시됩니다. 가장 쉬운 해결책은 StringBuffer에 쓰고 0을 받으면이를 출력하는 것입니다.

+0

아. 그래서 PrintWriter가 작동하더라도, 코드의 중간에 경고없이 플러시 될 수 있으므로, 나는 그것에 의존해서는 안됩니다. – Retsam

+1

예, 버퍼링하는 부작용과 버퍼의 크기에 의존하고 있습니다. 요구 사항 중 하나 인 경우 인쇄하기 전에 모든 결과를 버퍼링하려면 자체 구현해야합니다. 귀하의 경우, 문자열 StringBuffer 괜찮을 것입니다. 이진 데이터의 경우 ByteArrayOutputStream을 사용하는 것이 일반적입니다. – slipperyseal