2014-11-11 23 views
5

Bu soruyu Using flush() before close() okudum ve kabul edilen yanıt bu yalnızca kalıbı takip ettiğiniz anlamına gelir. Sadece BufferedWriter#close() veya FilterOutputStream.#close() gibiGerçekten flush() 'ı bugün hemen önce kapatmalı mıyız?

, biz close() diyoruz ve biz (dev ve kod gözden geçirecektir dev) hepimiz biliyoruz, biz gerçekten hala ihtiyacımız ne zaman tamponlu Akış/Writer tüm onun flush() arayacak eğer bu? Eğer evet ise, sebep ne olacak? çıkışı için

+0

IMO, yok, ama bu size Yazar veya OutputStream uygulamasından geçiş eğer Gerekli olanlara floş yok, sen sahip beklenmeyen davranışlara sona erebilir :-) iyi bir fikir olduğu anlamına gelmez. Bazı işe yaramaz flush() 'lerin kötü bir JVM tasarımına sahip olduğunu, sonra cevabımın belki "belki" :-) olduğunu söyleyebiliriz. JVM'nin önceki sürümleri de sorunsuz bir şekilde çalışıyorsa, araştırmamız gereken başka bir şey geriye dönük uyumluluk hakkındadır. flush(). – Leo

+0

Tam olarak ne için soruyorsunuz, hangi linke bağlandığınız ile ilgili değil mi? – jarnbjo

+0

@jarnbjo, Sadece bunun sadece bir kuralın açık bir şekilde uygulandığı iddialı bir iş olup olmadığını bilmek istiyorum. – Jaskey

cevap

2

Javadoc'un dediği gibi, kendinizi temizlemek için 'a ihtiyacınız yoktur. Ancak, okuyucular ve sağduyu göz önüne alındığında, yine de iyi.

Birkaç uzman javadoc'u kalpten bilir. Akıntının bakılmaksızın temizlenip temizlenmeyeceğinden emin değilim ve muhtemelen yalnız değilim. Açık flush() görüşünü görmek, bunu mükemmel bir şekilde temizler, ve bu nedenle kodun okunmasını kolaylaştırır. Ayrıca, close() yöntem adı, yıkama hakkında hiçbir anlam ifade etmemektedir. Closeable arabiriminden, ve doğal olarak, yıkama hakkında hiçbir şey söylemiyor. Kapanmadan önce arabelleğe alınmış bir çıktı akışını akıtmazsanız, temizlemeyi istemesine rağmen, doğru veya yanlış olabilecek varsayımlara güvenebilirsiniz. Uygulamanızı zayıflatır.

Herhangi varsayımlar size nasılsa gelecek maintainers'ı geçmek gerekir yapmak. Bu yorumu gitmezsen benim gibi onlar 'yok eğer

// no need to flush() manually, close() will do it automatically 

, gelecek Maintainers çok javadoc arama için olabilir: Bunu yapmanın bir yolu, bir yorum bırakarak gereğidir ezberlemiş. Ama sonra, neden şimdi kendiniz aramak ve onunla bitmek daha kolay ve daha iyi olduğunda böyle bir yorum yazabilirsiniz. Kısaca, önce kapamadan önce kızarma, basit bir mantığı takip etmektir. varsayımlarına ve ikinci tahminlere ihtiyaç yoktur ve okuyucularınızın düşünmesine gerek yoktur.

+0

Temizlenecek iki şey daha var.1.Yalnızca buffrered akış, close() 'dan önce flush()' a ihtiyaç duyar. 2. Java'da her türlü akış. io kapatmadan() kapatırsam herhangi bir yan etkisi olmayacaktır. Doğru mu? – Jaskey

+0

1. Evet, yıkama, tamponlanmış çıktıya özgü bir kavramdır. Ayrıca bakınız [Flushable] (https://docs.oracle.com/javase/7/docs/api/java/io/Flushable.html) 2. java.io'da çok az yayın var. Doğrulamak için hepsinden geçmek zorundayım ve bunu yaparken bunu anlamıyorum. Diğer yandan, bir kez daha gömmek, güncellenmiş cevabımı görmek için ekledim. – janos

-1

, biz ilk yanıt here tarafından açıklandığı gibi tamponlu veriler, kaybolabilir çünkü floş() ve close() diyorlar önemlidir. Programınızın çıktısı smalland ise, yazıcınız hızlı bir şekilde bitirirse, deneyimimdeki close() ve flush() için çok fazla fark yaratmaz.

Girdi için, sistem çıkmadan önce close() işlevini çağırmamamız önemli değildir.

+0

Ancak close() 'zaten bizim için deşarj, bu yüzden benim soru şu ki bu neden önce() – Jaskey

+0

daha önce bunu yapmak zorunda kalmadan önce el ile çalkalama gereği, neden olmasın diye emin değilim. –

+1

http://stackoverflow.com/questions/9858495/using-flush-before-close – Jaskey