Java akışlarında flush () işlevinin amacı nedir?


121

Java'da flush()yöntem akışlarda kullanılır. Ama bu yöntemi kullanmanın tüm amacının ne olduğunu anlamıyorum?

fin.flush();

bana bazı önerilerde bulun.

Yanıtlar:


101

Gönderen dokümanlar arasında flushyöntemiyle:

Çıktı akışını temizler ve tamponlanmış çıktı baytlarının yazılmasını zorlar. Genel temizleme sözleşmesi, onu çağırmanın, daha önce yazılmış baytların çıktı akışının uygulanmasıyla tamponlanmış olması durumunda, bu tür baytların derhal amaçlanan hedeflerine yazılması gerektiğinin bir göstergesidir.

Arabelleğe alma, esas olarak G / Ç performansını iyileştirmek için yapılır. Bununla ilgili daha fazla bilgiyi bu makaleden okuyabilirsiniz: Java I / O Performansını Ayarlama .


1
Ayarlama Java I / O Performansına yeni bağlantı oracle.com/technetwork/articles/javase/perftuning-137844.html
Oleksandr

+1 Teşekkürler. Baytlarımın neden gönderilmediğini anlayamadım ve bunun nedeni arabelleklerimi temizlemem gerekti.
rayryeng

3
Yıkama yöntemi yalnızca arabelleğe alınmış akışlarla mı kullanılır? onu diğer akışlarla (örneğin çıktı akışı) kullanmanın herhangi bir avantajı var mı?
tnishada

Belki de 'floş' kelimesi kendi tanımında olmamalıdır. Özyinelemeli tanımlar, yeni şeyleri anlamak için kötü bir fikirdir. Tanımı yazmadığının farkındayım.
Jonathan Komar

27

Herhangi bir komut verdiğimizde, bu komutun akışları, bilgisayarımızda tampon adı verilen bellek konumunda (geçici bir bellek konumu) saklanır. Tüm geçici bellek konumu dolduğunda, tüm veri akışlarını temizleyen ve bunları tamamen çalıştıran ve tampon geçici konumunda yeni akışlara yeni bir alan veren flush () kullanıyoruz. -Umarım anlayacaksın


1
Sadece durumunda BufferedOutputStream, BufferedWriter, ObjectOutputStream,ve PrintXXXsınıflar. flush()Başka akışının yöntemi veya Writerhiçbir şey yapmaz.
Marquis of Lorne

@EJP İfadelerinizi yedeklemek için herhangi bir referans var mı? Bize yeni başlayanlar için yardımcı olur :)
mr5

1
@ mr5 İfadelerini yedeklemesi gereken poster, ben değil, ama söylediğim her şey Javadoc
Marquis of Lorne'da

Yazar olarak siz olduğunuz sürece flush()a için açıkça çağırmaya gerek yoktur . kendi başına bir floş çalıştırır. BufferedWriterclose()close()
Yossarian42

close()Çağrıları not edin flush(), bu nedenle FileWriterara bellek olmadan kullanıldığında her ikisinin de çağrılması gereksizdir .
Yossarian 42

26

Bir akışa veri yazdığınızda, hemen yazılmaz ve arabelleğe alınır. Kullanım Yani flush()emin tampon gelen tüm verileriniz yazılı olduğu olmanız gerektiğinde.

Akışı kapatmadan önce tüm yazma işlemlerinin tamamlandığından emin olmalıyız ve bu yüzden flush()dosya / tamponlu yazıcılarda çağrılır close().

Ancak, akışı kapatmadan önce tüm yazılarınızın istediğiniz zaman kaydedilmesi şartınız varsa kullanın flush().


8
Kapatmadan hemen önce floş çağırmak gereksizdir, değil mi? sadece yakını aramakla aynıdır.
John Henckel

2
@BimanTripathy Bunu% 100 güvence ile söyleyebilirim. Javadoc tarafından garantilidir FilterOutputStreamve FilterWriter.
Marquis of Lorne

7

Arabellek doluysa, arabelleğe alınan tüm dizeler diske kaydedilecektir. Tamponlar, Büyük Fırsatlardan kaçınmak için kullanılır! ve genel gider.

Java kitaplarına yerleştirilen BufferedWriter sınıfında, aşağıdaki gibi bir satır vardır:

private static int defaultCharBufferSize = 8192;

Arabellek dolmadan önce veri göndermek istiyorsanız, kontrol sizdedir. Sadece Yıkayın. Writer.flush () 'a yapılan çağrılar, "arabellekte ne varsa hemen gönder!

referans kitabı: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

sayfalar: 453


4

Akışlara genellikle içeriklerini periyodik olarak boşaltan ve örneğin ekranda görüntüleyen, bir sokete gönderen veya bir dosyaya yazan diziler tarafından erişilir. Bu, performans nedenleriyle yapılır. Bir çıktı akışını temizlemek, durdurmak istediğiniz, akış içeriğinin hedefine tamamen aktarılmasını beklediğiniz ve ardından akış boş ve içerik gönderilerek yürütmeye devam ettiğiniz anlamına gelir.


5
Bu bir fantezi. Akışlara herhangi bir sihirli konu ile erişilmez; yalnızca uygulama tarafından oluşturulanlar.
Marquis of Lorne

3

Performans sorunu için ilk veri Buffer'a yazılmalıdır. Tampon dolduğunda veriler çıktıya yazılır (Dosya, konsol vb.). Arabellek kısmen doldurulduğunda ve çıktıya (dosya, konsol) göndermek istediğinizde, çıktıya (dosya, konsol) kısmen doldurulmuş arabelleği yazmak için flush () yöntemini manuel olarak çağırmanız gerekir.


Bu doğru değil. FileOutputStream.flush () boş bir işlemsizdir.
vertuso
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.