En dıştaki akışı kapatabilirsiniz, aslında sarılmış tüm akışları tutmanıza gerek yoktur ve Java 7 kaynakla deneme özelliğini kullanabilirsiniz.
try (BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
new GZIPOutputStream(new FileOutputStream(createdFile)))) {
// write to the buffered writer
}
YAGNI'ye abone olursanız veya buna ihtiyacınız olmayacaksa, yalnızca gerçekten ihtiyacınız olan kodu eklemelisiniz. İhtiyaç duyabileceğinizi düşündüğünüz kodu eklememelisiniz, ancak gerçekte yararlı hiçbir şey yapmaz.
Bu örneği alın ve bunu yapmazsanız neyin yanlış gidebileceğini ve bunun etkisinin ne olacağını hayal edin.
try (
OutputStream outputStream = new FileOutputStream(createdFile);
GZIPOutputStream gzipOutputStream = new GZIPOutputStream(outputStream);
OutputStreamWriter osw = new OutputStreamWriter(gzipOutputStream);
BufferedWriter bw = new BufferedWriter(osw)
) {
// ...
}
open
Tüm gerçek işi yapmaya çağıran FileOutputStream ile başlayalım .
/**
* Opens a file, with the specified name, for overwriting or appending.
* @param name name of file to be opened
* @param append whether the file is to be opened in append mode
*/
private native void open(String name, boolean append)
throws FileNotFoundException;
Dosya bulunmazsa kapatılacak temel kaynak yoktur, bu nedenle kapatmak herhangi bir fark yaratmaz. Dosya varsa, bir FileNotFoundException oluşturması gerekir. Yani kaynağı tek başına bu hattan kapatmaya çalışmakla kazanılacak bir şey yok.
Dosyayı kapatmanızın nedeni, dosyanın başarıyla açıldığı, ancak daha sonra bir hata alacağınız zamandır.
Bir sonraki akışa bakalım GZIPOutputStream
Bir istisna atabilecek bir kod var
private void writeHeader() throws IOException {
out.write(new byte[] {
(byte) GZIP_MAGIC, // Magic number (short)
(byte)(GZIP_MAGIC >> 8), // Magic number (short)
Deflater.DEFLATED, // Compression method (CM)
0, // Flags (FLG)
0, // Modification time MTIME (int)
0, // Modification time MTIME (int)
0, // Modification time MTIME (int)
0, // Modification time MTIME (int)
0, // Extra flags (XFLG)
0 // Operating system (OS)
});
}
Bu, dosyanın başlığını yazar. Şimdi, bir dosyayı yazmak için açabilmeniz ancak ona 8 bayt bile yazamamanız çok alışılmadık bir durum olurdu, ancak bunun olabileceğini düşünelim ve sonra dosyayı kapatmayalım. Kapatılmamış bir dosyaya ne olur?
Herhangi bir boşaltılmamış yazma almazsınız, bunlar atılır ve bu durumda, bu noktada zaten arabelleğe alınmayan akışa başarıyla yazılmış baytlar yoktur. Ancak kapatılmamış bir dosya sonsuza kadar yaşamaz, bunun yerine FileOutputStream'de
protected void finalize() throws IOException {
if (fd != null) {
if (fd == FileDescriptor.out || fd == FileDescriptor.err) {
flush();
} else {
/* if fd is shared, the references in FileDescriptor
* will ensure that finalizer is only called when
* safe to do so. All references using the fd have
* become unreachable. We can call close()
*/
close();
}
}
}
Bir dosyayı hiç kapatmazsanız, yine de kapatılır, hemen değil (ve dediğim gibi, bir arabellekte kalan veriler bu şekilde kaybolur, ancak bu noktada hiçbiri yoktur)
Dosyayı hemen kapatmamanın sonucu nedir? Normal koşullar altında, potansiyel olarak bazı verileri kaybedersiniz ve potansiyel olarak dosya tanımlayıcılarınız tükenir. Ancak dosya oluşturabileceğiniz bir sisteminiz varsa ancak bunlara hiçbir şey yazamıyorsanız, daha büyük bir sorununuz var. yani, başarısız olmanıza rağmen neden bu dosyayı tekrar tekrar oluşturmaya çalıştığınızı hayal etmek zor.
Hem OutputStreamWriter hem de BufferedWriter, kurucularında IOException oluşturmaz, bu nedenle hangi soruna neden olacakları net değildir. BufferedWriter durumunda, bir OutOfMemoryError alabilirsiniz. Bu durumda, derhal bir GC'yi tetikleyecektir, bu da gördüğümüz gibi dosyayı yine de kapatacaktır.