Pertanyaan Apakah menutup BufferedOutputStream juga menutup OutputStream yang mendasarinya?


Saya mengalirkan data biner (file CSV yang diekstrak dari database sebagai Clob) ke browser dengan memanggil response.getOutputStream () dan biasanya akan membungkus OutputStream dalam BufferedOutputStream ketika menyalin data.

Haruskah saya menutup BufferedOutputStream atau apakah ini juga akan menutup OutputStream yang mendasarinya?

[Pertanyaan tambahan: Apakah saya perlu menggunakan BufferedOutputStream dalam kasus ini atau apakah respons sudah di-buffer?]


11
2017-09-15 16:08


asal


Jawaban:


Ya, itu menutupnya. Adapun apakah Anda harus menutupnya - apakah Anda mengharapkan untuk menulis hal lain ke aliran tanggapan? Jika tidak, saya pikir tidak apa-apa untuk menutupnya. Jika Anda tidak menutupnya, Anda harus jelas menyiramnya - tetapi saya kira Anda bisa mencari tahu sendiri :)

Perilaku itu sebenarnya diwarisi dari FilterOutputStream. The Javadocs untuk FilterOutputStream.close negara:

Metode dekat FilterOutputStream   memanggil metode flush, dan kemudian memanggil   metode dekat yang mendasarinya   arus keluaran.

Apakah Anda harus menyangga - saya tidak yakin ini didefinisikan dengan baik. Ini mungkin terkubur di spesifikasi servlet di suatu tempat - dan itu bahkan dapat dikonfigurasi (kadang-kadang Anda benar-benar tidak ingin buffering, tetapi jika Anda dapat menyangga seluruh respons itu berarti Anda dapat melayani halaman kesalahan lebih bagus jika ada yang salah setelah Anda ' sudah mulai menulis).


11
2017-09-15 16:10



Menutup BufferedOutputStream juga akan menutup OutputStream yang mendasarinya. Kamu harus tutup BufferedOutputStream sehingga flushes isinya sebelum menutup aliran yang mendasarinya. Lihat penerapan FilterOutputStream.close () (dari mana BufferedOutputStream diperluas) untuk meyakinkan diri Anda sendiri.

Saya kira bahwa apakah aliran respons yang diberikan kepada servlet Anda disangga atau tidak tergantung pada penerapan Servlet Container Anda. FWIW Saya tahu bahwa Tomcat melakukan buffer aliran respons servlet secara default, untuk mencoba mengatur header HTTP panjang konten.


4
2017-09-15 16:14