2010-02-26 3 views

답변

65

:

는 출력 스트림을 플래시 버퍼 출력 바이트가 강제적으로 써. flush의 범용 규약에서는, 출력 스트림의 구현에 의해 이전에 기입해진 바이트가 버퍼링되고있는 경우, 그러한 바이트를 즉시 의도 된 목적지에 기입해야한다는 것을 나타내는 것입니다.

버퍼링은 주로 I/O 성능을 향상시키기 위해 수행됩니다. 이에 대한 자세한 내용은 Tuning Java I/O Performance에서 확인할 수 있습니다.

+1

신선한 링크 http://www.oracle.com/technetwork/articles/javase/perftuning-137844.html – Oleksandr

+0

+1 감사합니다. 내 바이트가 전송되지 않은 이유를 알아낼 수 없었습니다. 버퍼를 플러시해야했기 때문입니다. – rayryeng

+1

flush 메서드는 버퍼링 된 스트림에서만 사용됩니까? 다른 스트림 (예 : outputstream)과 함께 사용하면 어떤 이점이 있습니까? – tnishada

3

스트림은 내용을 주기적으로 비우기위한 스레드에 의해 액세스되는 경우가 많으며, 예를 들어 화면에 표시하거나 소켓에 보내거나 파일에 쓰는 경우가 있습니다. 이는 성능상의 이유로 수행됩니다. 출력 스트림을 비우는 것은 중지하고 스트림의 내용이 목적지로 완전히 전송 될 때까지 기다린 다음 스트림이 비어 있고 내용이 전송되도록 실행을 다시 시작한다는 것을 의미합니다.

+1

이것은 환상입니다. 스트림은 마법 스레드에 의해 액세스되지 않습니다. 애플리케이션에 의해 생성 된 것만 – EJP

14

데이터를 스트림에 쓸 때 즉시 기록되지 않고 버퍼링됩니다. 그래서 버퍼의 모든 데이터가 쓰여질 필요가있을 때 flush()를 사용하십시오.

스트림을 닫기 전에 모든 쓰기가 완료되었는지 확인해야하므로 file/buffered writer의 close()에서 flush()가 호출됩니다.

그러나 당신은 당신의 쓰기가 당신이 스트림을 닫기 전에 언제 플러시 사용하는 저장 요구 사항이있는 경우() 우리가 어떤 명령을 줄 때

+2

닫기 직전에 플러시를 호출하면 중복이 발생합니다. 맞습니까? 단순히 close를 호출하는 것과 같습니다. –

+2

@BimanTripathy 나는 그것을 100 % 보증한다고 말할 수있다. 이것은 Javadoc에 의해'FilterOutputStream'과'FilterWriter'에 의해 보증됩니다. – EJP

+0

예, 닫기 전에 플러시를 호출하는 것이 중복됩니다. –

20

은 해당 명령의 스트림 메모리 위치라는 버퍼에 저장 임시 메모리 위치가 가득 차면 임시 메모리 위치가 꽉 찼을 때 flush()를 사용하여 모든 데이터 스트림을 플러시하고 완전히 실행하고 버퍼 임시 위치에 새 스트림에 새 공간을줍니다. - 희망 당신이 이해할 것입니다

+0

'BufferedOutputStream','BufferedWriter','ObjectOutputStream','PrintXXX' 클래스의 경우에만. 다른 스트림이나'Writer'의'flush()'메소드는 아무것도하지 않습니다. – EJP

+0

@EJP 귀사의 주장을 뒷받침 할만한 자료가 있습니까? 우리 초보자에게 도움이 될 것입니다 :) – mr5

+1

@ mr5 그것은 저의 말을 뒷받침 할 필요가있는 포스터입니다.하지만 제가 말한 모든 것은 명확하게 Javadoc에 명시되어 있습니다. – EJP

2

성능 문제에 대한 첫 번째 데이터는 버퍼에 기록됩니다. 버퍼가 가득 차면 데이터가 출력 (파일, 콘솔 등)에 기록됩니다. 버퍼가 부분적으로 채워지고 output (file, console)으로 보내고 싶다면, 부분적으로 채워진 버퍼를 output (file, console)에 쓰려면 flush() 메소드를 수동으로 호출해야합니다.

3

버퍼가 가득 찬 경우 버퍼링 된 모든 문자열이 디스크에 저장됩니다. 버퍼는 Big Deals에서 피하는 데 사용됩니다! 및 오버 헤드. 당신은 버퍼가 가득하기 전에 데이터를 보낼 경우

private static int defaultCharBufferSize = 8192; 

, 당신이 제어 할 수 있습니다 않습니다

자바 libs와에 배치의 BufferedWriter 클래스에서

는 한 줄처럼이있다. 그냥 플러시. writer.flush()에 대한 호출은 "버퍼에있는 내용을 지금 보내십시오!

참고 도서 : https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

페이지 : 튜닝 자바 I/O 성능에 453

관련 문제