2012-12-26 29 views
6

Tôi đã tự hỏi rằng cách tốt nhất/thích hợp để giải phóng tài nguyên/xử lý tệp là gì.Phát hành tài nguyên I/O đúng cách

đang truyền thống,

BufferredInputStream stream = null 
try{ 
    ---- 
    stream = new BufferredInputStream(new FileInputStream()); 
    ---- 
} finally{ 
    if(stream != null){ 
    stream.close() 
    } 

}

sẽ các tập tin xử lý được phát hành bằng cách đóng BufferredInputStream.close một mình hoặc nó cần sự tiềm ẩn stream(i.e. FileInputStream.close()) cũng được gọi một cách rõ ràng.

P.S. Javadoc for [FilterOutputStream.close] phương pháp chỉ định rằng nó sẽ đóng một cách rõ ràng luồng cơ bản. Nhưng các luồng khác dường như không có trong tài liệu này.

[FilterOutputStream.close]: http://docs.oracle.com/javase/1.4.2/docs/api/java/io/FilterOutputStream.html#close%28%29 

Vui lòng tư vấn. Cảm ơn trước.

+0

Bạn có thể dễ dàng kiểm tra nó bằng cách chỉ đóng đối tượng BufferredInputStream và cố gắng thao tác với FileInputStream và xem có bất kỳ ngoại lệ nào của luồng đóng được nâng lên hay không. Tôi tin rằng nó sẽ được đóng lại như bạn thấy trong nhiều ví dụ doc, luồng cơ bản được tạo ẩn danh – giorashc

+0

Chỉ cần một gợi ý: Nếu bạn đang sử dụng JDK 7, hãy sử dụng các tài nguyên thử, nó đơn giản hơn rất nhiều. Xem [tại đây] (http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html). –

+0

Cảm ơn bạn đã gợi ý JavaNewbie_M107. Java 7 chưa được thêm vào dự án. Tôi đang mong chờ nó –

Trả lời

4

Bạn luôn có thể kiểm tra mã nguồn cho lớp cơ bản để xác định hành vi chính xác.

Tuy nhiên, trong trường hợp này, hãy gọi close() trên BufferedInputStream cũng sẽ đóng luồng cơ bản tức là FileInputStream.

Mã nguồn có sẵn here

2

Khi nhiều luồng được kết nối, luồng cuối cùng được xây dựng sẽ đóng luồng bên dưới. Vì vậy, đóng BufferedInputStream cũng sẽ đóng số FileInputStream cơ bản.

Vì vậy, bạn chỉ cần gọi gần() trên một luồng và nó sẽ tự động đóng luồng cơ bản.

+0

Cảm ơn bạn đã trả lời. Javadoc không đề cập đến như vậy. Có bất kỳ tài liệu tham khảo hoặc bằng chứng để hỗ trợ câu trả lời này. Đang làm việc trên một vấn đề quan trọng để ngăn chặn tập tin xử lý rò rỉ. –

+0

Kiểm tra liên kết trong câu trả lời của Mr.Usman. Cuộn xuống phía dưới và bạn sẽ thấy cách thức phương thức close() hoạt động. Nó đang đóng InputStream đã bị xích vào BufferdInputStream. –

0

BufferredInputStream không tự giữ bất kỳ tài nguyên hệ thống để BufferredInputStream.close() sẽ đơn giản tuyên truyền cuộc gọi gần InputStream nó kết thúc tốt đẹp .. vì vậy nó nên làm tốt.

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