2013-08-05 29 views
5
OutputStream fos; 
OutputStream bos; 
OutputStream zos; 
try { 
    fos = new FileOutputStream(anyFile); 
    bos = new BufferedOutputStream(fos); 
    zos = new ZipOutputStream(bos); 
} finally { 
    if (zos != null) { 
     zos.close(); // + exception handling 
    } 
} 

Không đóng zos cũng tự động đóng bosfos quá hay tôi cần đóng thủ công?Đóng một luồng lồng nhau cũng đóng luồng gốc của nó?

+1

Bạn cũng nên cẩn thận * luôn * đóng luồng ngoài cùng; nếu không bạn có thể bị mất dữ liệu do các bộ đệm không bị dính trong các luồng bao bọc có dòng bọc của chúng được đóng lại dưới mũi của chúng. –

Trả lời

5

Vâng, đúng vậy. Số Javadoc của nó cho biết:

Đóng luồng đầu ra ZIP cũng như luồng đang được lọc.

Ngoài ra, Javadoc for BufferedOutputStream nói:

Đóng output stream này và phiên bản bất kỳ tài nguyên hệ thống liên quan đến suối.

Phương thức close của FilterOutputStream gọi phương thức flush và sau đó gọi phương thức close của luồng đầu ra cơ bản.

Vì vậy, khi bạn đóng ZipOutputStream của bạn, nó sẽ đóng BufferedOutputStream của bạn, do đó sẽ đóng FileOutputStream của bạn.

2

Đóng luồng trình bao bọc tự động đóng luồng bên trong.

Vì vậy, trong trường hợp của bạn, bạn chỉ cần đóng ZipOutputStream. Đóng một dòng hai lần không ném một ngoại lệ do đó đóng một dòng bên trong một lần nữa (mặc dù không cần thiết) hoạt động như là tốt.

Đây là những gì xảy ra khi bạn khởi tạo một ZipOutputStream

public ZipOutputStream(OutputStream out) { 
    this.out = out; // BufferedOutputStream reference saved 
} 

Đây là việc thực hiện các ZipOutputStream.close()

public void close() throws IOException { 
    try { 
     flush(); 
    } catch (IOException ignored) { 
    } 
    out.close(); // BufferedOutputStream being closed 
} 

Tương tự, BufferedOutputStream tự động đóng FileOutputStream thông qua kế thừa của nó FilterOutputStream#close() đã được thực hiện như:

public void close() throws IOException { 
    try { 
     flush(); 
    } catch (IOException ignored) { 
    } 
    out.close(); // FileOutputStream being closed 
} 
0

Có. nhưng kỳ lạ khi tôi đang chạy quét pháo đài với tìm lỗi kích hoạt nó bắt tất cả các loại bao bọc và không tiết lộ suối như là các mục ưu tiên cao được cố định.Không chắc chắn lý do tại sao họ làm như vậy

Các vấn đề liên quan