Java 스트림에서 flush ()의 목적은 무엇입니까?


121

Java에서 flush()메서드는 스트림에서 사용됩니다. 하지만이 방법을 사용하는 목적이 무엇인지 이해가 안 되나요?

fin.flush();

몇 가지 제안을 들려주세요.

답변:


101

로부터 문서flush방법 :

출력 스트림을 비우고 버퍼 된 출력 바이트를 강제로 기록합니다. 플러시의 일반적인 계약은이를 호출하는 것은 이전에 기록 된 바이트가 출력 스트림의 구현에 의해 버퍼링 된 경우 해당 바이트가 의도 한 대상에 즉시 기록되어야 함을 나타냅니다.

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


1
Tuning Java I / O Performance에 대한 새로운 링크 oracle.com/technetwork/articles/javase/perftuning-137844.html
Oleksandr

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

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

아마도 '플러시'라는 단어는 정의에 포함되어서는 안됩니다. 재귀 적 정의는 새로운 것을 이해하는 데 좋지 않습니다. 나는 당신이 정의를 작성하지 않았다는 것을 알고 있습니다.
Jonathan Komar는

27

명령을 내리면 해당 명령의 스트림은 컴퓨터의 buffer (임시 메모리 위치)라는 메모리 위치에 저장됩니다. 모든 임시 메모리 위치가 가득 차면 모든 데이터 스트림을 플러시하고 완전히 실행하고 버퍼 임시 위치의 새 스트림에 새 공간을 제공하는 flush ()를 사용합니다. -당신이 이해하기를 바랍니다


1
단지의 경우 BufferedOutputStream, BufferedWriter, ObjectOutputStream,PrintXXX클래스. flush()다른 스트림 의 메서드 또는 Writer아무 작업도 수행하지 않습니다.
Marquis of Lorne

@EJP 귀하의 진술을 백업하는 것에 대한 언급이 있습니까? 그것은 우리 초보자에게 도움이 될 것입니다 :)
mr5

1
@ MR5 그것은 나 자신의 진술을 백업 할 필요가있는 포스터는하지만, 내가 말한 모든 것이 자바 독에 명확하게 적혀있다
론의 후작

작성자 라면 에는 flush()명시 적으로 호출 할 필요가 없습니다 . 플러시 자체를 실행합니다. BufferedWriterclose()close()
Yossarian42

close()호출 flush()하므로 FileWriter버퍼없이 사용할 때 둘 다 호출하는 것이 중복됩니다 .
Yossarian42

26

스트림에 데이터를 쓸 때 즉시 기록되지 않고 버퍼링됩니다. 따라서 flush()버퍼의 모든 데이터가 기록되었는지 확인해야 할 때 사용 하십시오.

스트림을 닫기 전에 모든 쓰기가 완료되었는지 확인해야합니다. 이것이 flush()파일 / 버퍼링 된 writer에서 호출되는 이유 입니다 close().

그러나 스트림을 닫기 전에 언제든지 모든 쓰기를 저장해야하는 요구 사항이있는 경우 flush().


8
닫기 직전에 플러시를 호출하는 것은 중복되지 않습니다. 단순히 close를 호출하는 것과 같습니다.
John Henckel 2014 년

2
@BimanTripathy 100 % 확신을 가지고 말할 수 있습니다. FilterOutputStream및 의 Javadoc에 의해 보장됩니다 FilterWriter.
Marquis of Lorne

7

버퍼가 가득 차면 버퍼링 된 모든 문자열이 디스크에 저장됩니다. 큰 거래를 피하기 위해 버퍼가 사용됩니다! 그리고 오버 헤드.

java libs에있는 BufferedWriter 클래스에는 다음과 같은 한 줄이 있습니다.

private static int defaultCharBufferSize = 8192;

버퍼가 가득 차기 전에 데이터를 보내려면 제어 권한이 있습니다. 그냥 플러시하십시오. writer.flush ()에 대한 호출은 "버퍼에있는 모든 것을 지금 보내십시오!

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

페이지 : 453


4

스트림은 종종 콘텐츠를 주기적으로 비우는 스레드에 의해 액세스되며, 예를 들어 화면에 표시하거나 소켓에 전송하거나 파일에 기록합니다. 이는 성능상의 이유로 수행됩니다. 출력 스트림을 플러시한다는 것은 중지하고 스트림의 내용이 대상으로 완전히 전송 될 때까지 기다린 다음 스트림이 비어 있고 내용이 전송 된 상태에서 실행을 다시 시작한다는 것을 의미합니다.


5
이것은 환상입니다. 스트림은 마법의 스레드에 의해 액세스되지 않습니다. 응용 프로그램에 의해 생성 된 것만.
론의 후작

3

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


이것은 사실이 아닙니다. FileOutputStream.flush ()는 빈 no-op입니다.
vertuso
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.