Saya membaca file lokal menggunakan BufferedReader melilit FileReader:
BufferedReader reader = new BufferedReader(new FileReader(fileName));
// read the file
// (error handling snipped)
reader.close();
Apakah saya perlu close()
yang FileReader
juga, atau akan pembungkus pegangan itu? Saya telah melihat kode di mana orang melakukan sesuatu seperti ini:
FileReader fReader = new FileReader(fileName);
BufferedReader bReader = new BufferedReader(fReader);
// read the file
// (error handling snipped)
bReader.close();
fReader.close();
Metode ini dipanggil dari servlet, dan saya ingin memastikan saya tidak membiarkan pegangan terbuka.
java
io
bufferedreader
filereader
Zilk
sumber
sumber
Jawaban:
tidak.
menutup aliran menurut javadoc untuk BufferedReader dan InputStreamReader
sebaik
tidak.
sumber
BufferedReader
melempar pengecualian. Lebih bersih hanya untuk menutup aliran yang mendasarinya, meskipun Anda harus berhati-hati terhadap dekorator dengan sumber daya dan penyangga lainnya.BufferedReader.close()
menutup pembaca yang mendasarinya. Uraiannya hanya disalin dariReader.close()
. Ini mungkin perilaku yang sebenarnya dalam praktik, tetapi tidak didokumentasikan.Reader#close()
javadoc's tidak mengatakan apakah ditutup atau tidak itu dibungkus Pembaca atau tidak. Semua yang dikatakan terkait dengan hal itu adalahCloses the stream and releases any system resources associated with it.
yang tidak cukup eksplisit untuk mengatakan bahwa ia menutup sumber daya. 'Lepaskan sumber daya' mungkin juga menghapus referensi ke sumber daya di BufferedReader ... yang berarti sumber daya tidak ditutup.Seperti yang telah ditunjukkan orang lain, Anda hanya perlu menutup pembungkus luar.
Ada kemungkinan sangat kecil bahwa ini bisa bocor menangani file jika
BufferedReader
konstruktor melempar pengecualian (misalnyaOutOfMemoryError
). Jika aplikasi Anda dalam kondisi ini, seberapa hati-hati pembersihan Anda mungkin bergantung pada seberapa kritisnya Anda tidak menghilangkan OS sumber daya yang mungkin ingin dialokasikan ke program lain.The dapat ditutup antarmuka dapat digunakan jika konstruktor wrapper cenderung gagal di Jawa 5 atau 6:
Kode Java 7 harus menggunakan pola coba-dengan-sumber daya :
sumber
Menurut sumber BufferedReader, dalam hal ini bReader.close panggil fReader.close jadi secara teknis Anda tidak perlu memanggil yang terakhir.
sumber
Kode sumber untuk BufferedReader menunjukkan bahwa yang mendasarinya ditutup ketika Anda menutup BufferedReader.
sumber
Reader#close()
, ini tidak memberikan bukti konkret bahwa Oracle JDK, misalnya, diimplementasikan dalam busana serupa.Setelah memeriksa kode sumber, saya menemukan itu sebagai contoh:
metode close () pada objek BufferedReader akan memanggil metode close () abstrak dari kelas Reader yang pada akhirnya akan memanggil metode yang diterapkan di kelas InputStreamReader , yang kemudian menutup objek InputStream .
Jadi, hanya bReader.close () yang cukup.
sumber
Mulai dari Java 7 Anda dapat menggunakan Pernyataan coba-dengan-sumber daya
Karena
BufferedReader
instance dideklarasikan dalam pernyataan coba-dengan-sumber daya, ia akan ditutup terlepas dari apakah pernyataan coba selesai secara normal atau tiba-tiba. Jadi Anda tidak perlu menutupnya sendiri dalamfinally
pernyataan. (Ini juga kasus dengan pernyataan sumber daya bersarang)Ini adalah cara yang disarankan untuk bekerja dengan sumber daya, lihat dokumentasi untuk informasi lebih rinci
sumber
Anda Hanya Perlu menutup bufferedReader yaitu reader.close () dan itu akan berfungsi dengan baik.
sumber
Saya terlambat, tetapi:
BufferReader.java:
sumber
Anda Tidak perlu menutup pembaca / penulis yang dibungkus.
Jika Anda telah melihat pada dokumen (
Reader.close()
,Writer.close()
), Anda akan melihat bahwa diReader.close()
dalamnya tertulis:Yang hanya mengatakan bahwa ia "melepaskan sumber daya sistem apa pun yang terkait dengannya". Meskipun itu tidak mengkonfirmasi .. itu memberi Anda dorongan untuk mulai mencari lebih dalam. dan jika Anda pergi ke
Writer.close()
sana hanya menyatakan bahwa itu menutup sendiri.Dalam kasus seperti itu, kami merujuk ke OpenJDK untuk melihat kode sumbernya.
Di BufferedWriter Line 265 Anda akan melihat
out.close()
. Jadi itu tidak menutup sendiri .. Itu sesuatu yang lain. Jika Anda mencari kelas untuk "out
" kejadian, Anda akan melihat bahwa dalam konstruktor di Baris 87 yangout
merupakan penulis kelas membungkus di mana ia memanggil konstruktor lain dan kemudian menetapkanout
parameter untuk itu sendiriout
variabel .Jadi .. Bagaimana dengan yang lain? Anda dapat melihat kode serupa di BufferedReader Line 514 , BufferedInputStream Line 468 dan InputStreamReader Line 199 . Lainnya saya tidak tahu tetapi ini harus cukup untuk mengasumsikan bahwa mereka tahu.
sumber