Apa tujuan flush () di aliran Java?


121

Di Java, flush()metode digunakan dalam aliran. Tetapi saya tidak mengerti apa tujuan menggunakan metode ini?

fin.flush();

beri tahu saya beberapa saran.

Jawaban:


101

Dari docs dari flushmetode:

Mengosongkan aliran keluaran dan memaksa semua byte keluaran yang di-buffer untuk ditulis. Kontrak umum flush adalah bahwa memanggilnya merupakan indikasi bahwa, jika ada byte yang sebelumnya ditulis telah di-buffer oleh implementasi aliran keluaran, byte tersebut harus segera ditulis ke tujuan yang dimaksudkan.

Buffering terutama dilakukan untuk meningkatkan kinerja I / O. Lebih lanjut tentang ini dapat dibaca dari artikel ini: Tuning Java I / O Performance .


1
Tautan baru ke Tuning Java I / O Performance oracle.com/technetwork/articles/javase/perftuning-137844.html
Oleksandr

+1 Terima kasih. Saya tidak tahu mengapa byte saya tidak dikirim, dan itu karena saya harus menghapus buffer saya.
rayryeng

3
Apakah metode flush hanya digunakan dengan aliran buffer? apakah ada keuntungan menggunakannya dengan aliran lain (misalnya aliran keluaran) juga?
tnishada

Mungkin kata 'flush' seharusnya tidak ada dalam definisinya. Definisi rekursif adalah ide yang buruk untuk memahami hal-hal baru. Saya sadar Anda tidak menulis definisi tersebut.
Jonathan Komar

27

Ketika kami memberikan perintah apa pun, aliran perintah itu disimpan di lokasi memori yang disebut buffer (lokasi memori sementara) di komputer kami. Ketika semua lokasi memori sementara penuh maka kami menggunakan flush (), yang membersihkan semua aliran data dan mengeksekusinya sepenuhnya dan memberikan ruang baru untuk aliran baru di lokasi sementara buffer. -Harap Anda akan mengerti


1
Hanya dalam kasus BufferedOutputStream, BufferedWriter, ObjectOutputStream,dan PrintXXXkelas. The flush()Metode dari setiap aliran lain atau Writertidak apa-apa.
Marquis dari Lorne

@EJP Ada referensi untuk membuat cadangan pernyataan Anda? Ini akan sangat membantu bagi kami pemula :)
mr5

1
@ mr5 Itu adalah poster yang perlu mendukung pernyataannya, bukan saya, tetapi semua yang saya katakan dinyatakan dengan jelas di Javadoc
Marquis dari Lorne

Memanggil flush()secara eksplisit tidak diperlukan untuk BufferedWriter, selama Anda close()penulisnya. close()menjalankan flush itu sendiri.
Yossarian42

Catat close()panggilan flush(), jadi memanggil keduanya berlebihan saat menggunakan FileWritertanpa buffer.
Yossarian42

26

Saat Anda menulis data ke aliran, data tidak langsung ditulis, dan di-buffer. Jadi gunakan flush()saat Anda perlu memastikan bahwa semua data Anda dari buffer ditulis.

Kita perlu memastikan bahwa semua penulisan telah selesai sebelum kita menutup aliran, dan itulah sebabnya flush()disebut dalam file / buffered writer close().

Tetapi jika Anda memiliki persyaratan bahwa semua tulisan Anda disimpan kapan saja sebelum Anda menutup streaming, gunakan flush().


8
Memanggil flush sebelum tutup itu mubazir, bukan? itu sama dengan sekadar menelepon dekat.
John Henckel

2
@BimanTripathy Saya dapat mengatakan itu dengan jaminan 100%. Ini dijamin oleh Javadoc dari FilterOutputStreamdan FilterWriter.
Marquis dari Lorne

7

Jika buffer sudah penuh, semua string yang di-buffer di dalamnya, mereka akan disimpan ke disk. Buffer digunakan untuk menghindari Transaksi Besar! dan overhead.

Di kelas BufferedWriter yang ditempatkan di java libs, ada satu baris seperti:

private static int defaultCharBufferSize = 8192;

Jika Anda ingin mengirim data sebelum buffer penuh, Anda memiliki kendali. Siram Saja. Panggilan ke writer.flush () mengatakan, "kirim apa pun yang ada di buffer, sekarang!

buku referensi: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

halaman: 453


4

Stream sering diakses oleh utas yang secara berkala mengosongkan kontennya dan, misalnya, menampilkannya di layar, mengirimkannya ke soket, atau menuliskannya ke file. Ini dilakukan untuk alasan kinerja. Membilas aliran keluaran berarti Anda ingin berhenti, menunggu konten aliran sepenuhnya ditransfer ke tujuannya, lalu melanjutkan eksekusi dengan aliran kosong dan konten dikirim.


5
Ini fantasi. Aliran tidak diakses oleh utas magis apa pun; hanya yang dibuat oleh aplikasi.
Marquis dari Lorne

3

Untuk masalah kinerja, data pertama harus ditulis ke dalam Buffer. Ketika buffer penuh maka data ditulis ke output (File, konsol, dll.). Ketika buffer terisi sebagian dan Anda ingin mengirimkannya ke output (file, konsol) maka Anda perlu memanggil metode flush () secara manual untuk menulis buffer yang terisi sebagian ke output (file, konsol).


Ini tidak benar. FileOutputStream.flush () adalah no-op kosong.
vertuso
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.