tank3a   2년 전

아래 9 ,10번 줄을 다음과 같이 작성하면 맞다고 채점이되고, 순서를 바꾸면 틀렸다고 채점이 되는데요..

bufferedwriter가 outputstreamwriter에 버퍼 단위만큼 끊어서 작성한다는 것은 이해를 했는데, 이 과정이 println과 섞이면 안된다는 답변만 있고, 이유를 모르겠어서 질문드립니다.

bufferedwriter가 write되면, 버퍼에 저장이 되있는데, 이때 println을 호출하면 buffer에 있는 내용이 출력이 되버리는건가요? println안에 내용이 이미 있는데 버퍼와 연관이 있나요?? 왜 두 줄의 순서만 바꿨다고 틀리게 되는지 이해가되지 않습니다ㅠㅠ

djm03178   2년 전

BufferedWriter는 write한 내용이 실제로 출력 스트림으로 넘어가는 시점을 '모른다'고 봐야 합니다.

즉, println을 먼저 하고 그 뒤에 BufferedWriter에 쓰기 시작했으면 순서가 보장이 되지만, BufferedWriter에 write를 먼저 했으면 그 내용이 실제로 System.out에 전달되는 시점이 언제일지 알 수 없기 때문에 그 내용이 먼저 출력될 수도 있고, 나중에 flush할 때 출력될 수도 있고, 아니면 일부만 출력한 뒤 println의 내용이 출력되고 그 뒤에 flush 시에 나머지 내용이 출력될 수도 있습니다.

bupjae   2년 전

BufferedWriter 는 자체적으로 버퍼를 가지고 있고, 버퍼가 어느정도 차면 주기적으로 출력 스트림에 버퍼의 내용물을 넘기고 버퍼를 비웁니다.

(flush 메소드를 호출하면 그 즉시 출력 스트림에 버퍼의 내용물을 넘기고 버퍼를 비웁니다)

   

위 프로그램에서 9번째 줄과 10번째 줄을 바꾸게 되면

write 메소드에 넘긴 내용물 중 "일부" 는 재귀호출 하는 도중에 먼저 출력되고 (출력할 내용물에 비해 버퍼가 충분히 크다면 하나도 출력 안 하는 경우도 있음),

그 뒤에 System.out.println 에 넘긴 내용물이 출력되고

그 뒤에 12번째 줄에서 BufferedReader 에 아직 남아있는 나머지 내용물이 출력됩니다.   

   

System.out.println 과 BufferedWriter 를 섞어쓰기 시작하면 BufferedWriter 의 내용물이 출력 타이밍과 관련된 결과를 예측하기 매우 어려워지기 때문에

보통은 그냥 간단하게 "두 방법을 섞어쓰지 마세요" 라고 설명합니다.

tank3a   2년 전

와 감사합니다!! Buffer에 대해 제가 제대로 이해하지 못했던 거군요.. 중간에 먼저 출력을 할수도 있다니 몰랐습니다

댓글을 작성하려면 로그인해야 합니다.