Jaki jest cel flush () w strumieniach Java?


121

W Javie flush()metoda jest używana w strumieniach. Ale nie rozumiem, jaki jest cel stosowania tej metody?

fin.flush();

powiedz mi kilka sugestii.

Odpowiedzi:


101

Od docs z flushmetodą:

Opróżnia strumień wyjściowy i wymusza wypisanie wszystkich buforowanych bajtów wyjściowych. Ogólny kontrakt flush polega na tym, że wywołanie go jest wskazaniem, że jeśli jakiekolwiek zapisane wcześniej bajty zostały zbuforowane przez implementację strumienia wyjściowego, to takie bajty powinny zostać natychmiast zapisane w miejscu docelowym.

Buforowanie jest wykonywane głównie w celu poprawy wydajności we / wy. Więcej na ten temat można przeczytać w tym artykule: Tuning Java I / O Performance .


1
Nowy link do dostrajania wydajności we / wy Java oracle.com/technetwork/articles/javase/perftuning-137844.html
Oleksandr

+1 Dziękuję. Nie mogłem zrozumieć, dlaczego moje bajty nie zostały wysłane, a to dlatego, że musiałem opróżnić moje bufory.
rayryeng

3
Czy metoda flush jest używana tylko w przypadku strumieni buforowanych? Czy jest jakaś korzyść z używania go również z innymi strumieniami (np. strumieniem wyjściowym)?
tnishada

Może słowo „flush” nie powinno znajdować się w jego definicji. Definicje rekurencyjne to zły pomysł na zrozumienie nowych rzeczy. Wiem, że nie napisałeś definicji.
Jonathan Komar

27

Kiedy wydajemy dowolne polecenie, strumienie tego polecenia są przechowywane w lokalizacji pamięci zwanej buforem (tymczasowa lokalizacja pamięci) w naszym komputerze. Gdy cała tymczasowa lokalizacja pamięci jest pełna, używamy flush (), która opróżnia wszystkie strumienie danych i wykonuje je w całości oraz daje nowe miejsce nowym strumieniom w tymczasowej lokalizacji bufora. -Mam nadzieję, że zrozumiesz


1
Tylko w przypadku BufferedOutputStream, BufferedWriter, ObjectOutputStream,i PrintXXXklas. flush()Metoda jakiegokolwiek innego strumienia lub Writernic nie robi.
Markiz Lorne

@EJP Jakieś odniesienia do tworzenia kopii zapasowych wyciągów? Byłoby to pomocne dla nas, początkujących :)
mr5

1
@ mr5 To plakat musi poprzeć swoje oświadczenia, nie ja, ale wszystko, co powiedziałem, jest jasno określone w Javadoc
Marquis of Lorne

Wywołanie flush()jawne nie jest wymagane dla a BufferedWriter, o ile jesteś close()autorem. close()sam wykonuje rzut.
Yossarian42,

Zwróć uwagę na close()wywołania flush(), więc wywołanie obu jest zbędne, gdy używasz FileWriterbez bufora.
Yossarian42,

26

Dane zapisane w strumieniu nie są zapisywane natychmiast i są buforowane. Dlatego używaj, flush()gdy chcesz mieć pewność, że wszystkie dane z bufora są zapisane.

Musimy mieć pewność, że wszystkie zapisy zostały zakończone, zanim zamkniemy strumień, i dlatego flush()jest wywoływana w zapisie pliku / buforowanym close().

Ale jeśli chcesz, aby wszystkie twoje zapisy były zapisywane w dowolnym momencie przed zamknięciem strumienia, użyj flush().


8
Sprawdzanie koloru tuż przed zamknięciem jest zbędne, prawda? to to samo, co zwykłe wezwanie do zamknięcia.
John Henckel

2
@BimanTripathy Mogę to powiedzieć ze 100% pewnością. Gwarantuje to Javadoc FilterOutputStreami FilterWriter.
Markiz Lorne

7

Jeśli bufor jest pełny, wszystkie buforowane w nim łańcuchy zostaną zapisane na dysku. Bufory służą do unikania wielkich okazji! i nad głową.

W klasie BufferedWriter, która jest umieszczona w bibliotekach java, znajduje się jeden wiersz, taki jak:

private static int defaultCharBufferSize = 8192;

Jeśli chcesz wysłać dane, zanim bufor się zapełni, masz kontrolę. Po prostu spłucz to. Wywołania metody writer.flush () mówią: „wyślij teraz wszystko, co jest w buforze!

książka referencyjna: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

strony: 453


4

Strumienie są często dostępne przez wątki, które okresowo opróżniają swoją zawartość i na przykład wyświetlają ją na ekranie, wysyłają do gniazda lub zapisują do pliku. Odbywa się to ze względu na wydajność. Opróżnianie strumienia wyjściowego oznacza, że ​​chcesz zatrzymać się, poczekać, aż zawartość strumienia zostanie całkowicie przesłana do miejsca docelowego, a następnie wznowić wykonywanie z pustym strumieniem i wysłaną zawartością.


5
To jest fantazja. Do strumieni nie mają dostępu żadne magiczne wątki; tylko te utworzone przez aplikację.
Markiz Lorne

3

W przypadku problemów z wydajnością pierwsze dane mają zostać zapisane w buforze. Gdy bufor się zapełni, dane są zapisywane na wyjściu (plik, konsola itp.). Gdy bufor jest częściowo zapełniony i chcesz wysłać go na wyjście (plik, konsola), musisz ręcznie wywołać metodę flush () w celu zapisania częściowo wypełnionego bufora na wyjście (plik, konsola).


To nie jest prawda. FileOutputStream.flush () jest pustym no-op.
vertuso
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.