Thông thường, bạn chỉ cần đóng luồng ngoài cùng nhiều nhất, vì theo quy ước, nó phải kích hoạt gần trên các luồng cơ bản.
Vì vậy, thường mã trông như thế này:
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
...
in.close(); // when you care about Exception-Handling in case when closing fails
}
finally {
IOUtils.closeQuietly(in); // ensure closing; Apache Commons IO
}
Tuy nhiên có thể có trường hợp hiếm gặp nơi một constructor dòng cơ bản đặt ra một ngoại lệ nơi con suối đã được mở ra. Trong trường hợp đó mã trên sẽ không đóng luồng cơ bản vì hàm tạo bên ngoài chưa bao giờ được gọi và in
là rỗng. Vì vậy, khối cuối cùng không đóng bất cứ điều gì để lại dòng cơ bản mở ra.
Kể từ Java 7 bạn có thể làm điều này:
try (OutputStream out1 = new ...; OutputStream out2 = new ...) {
...
out1.close(); //if you want Exceptions-Handling; otherwise skip this
out2.close(); //if you want Exceptions-Handling; otherwise skip this
} // out1 and out2 are auto-closed when leaving this block
Trong hầu hết các trường hợp, bạn không muốn xử lý ngoại lệ khi được nuôi trong khi đóng cửa nên bỏ qua những đóng rõ ràng() gọi.
Chỉnh sửa Đây là một số mã dành cho những người không phải là tín hữu khi sử dụng mô hình này. Bạn cũng có thể muốn đọc Apache Commons IOUtils javadoc về phương pháp closeQuietly().
OutputStream out1 = null;
OutputStream out2 = null;
try {
out1 = new ...;
out2 = new ...;
...
out1.close(); // can be skipped if we do not care about exception-handling while closing
out2.close(); // can be skipped if we ...
}
finally {
/*
* I've some custom methods in my projects overloading these
* closeQuietly() methods with a 2nd param taking a logger instance,
* because usually I do not want to react on Exceptions during close
* but want to see it in the logs when it happened.
*/
IOUtils.closeQuietly(out1);
IOUtils.closeQuietly(out2);
}
Sử dụng @ "lời khuyên" của Tom sẽ rời out1
mở ra khi tạo ra các out2
đặt ra một ngoại lệ. Lời khuyên này là từ một người nào đó nói về It's a continual source of errors for obvious reasons.
Vâng, tôi có thể bị mù, nhưng điều đó không rõ ràng đối với tôi. Mô hình của tôi là an toàn ngốc nghếch trong mọi trường hợp sử dụng mà tôi có thể nghĩ đến trong khi mẫu của Tom dễ bị lỗi.
Nguồn
2012-06-29 14:55:25
Bản sao có thể có của [Tôi có cần đóng() cả FileReader và BufferedReader không?] (Http://stackoverflow.com/questions/1388602/do-i-need-to-close-both-filereader-and-bufferedreader) – River