2013-05-16 25 views
9

Xem xét một BufferedReader như sau:Có cần phải đóng một FileWriter, miễn là nó được viết thông qua một BufferedWriter?

writer = new BufferedWriter(new FileWriter(new File("File.txt"), true)); 

Trong trường hợp này ở phần cuối của ứng dụng, tôi đang đóng writer với writer.close()

này sẽ là đủ? Liệu FileWriter đó có được tạo với new FileWriter(new File("File.txt"), true) cần được đóng lại không?

Trả lời

12

Không cần thiết phải đóng nó, vì BufferedWriter đóng vai trò quan trọng trong việc đóng trình soạn thảo.

Để thuyết phục bạn, đây là mã nguồn của phương pháp chặt chẽ của BufferedWriter:

public void close() throws IOException { 
    synchronized (lock) { 
     if (out == null) { 
      return; 
     } 
     try { 
      flushBuffer(); 
     } finally { 
      out.close(); 
      out = null; 
      cb = null; 
     } 
    } 
} 
+5

[Dòng 'out.close();' bị thiếu] (http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25 /java/io/BufferedWriter.java?av=f#259) trong Java 8 'BufferedWriter' – Mihai

+5

@ A.Roshenko nhìn kỹ, khối' try' đã được thay thế bằng khối 'try-with' trong java 8 BufferedReader. Vì vậy, cùng một điều, nhà văn cơ bản vẫn đang được đóng cửa trong java 8 là tốt. –

2

writer.close() cũng đóng các nhà văn/luồng cơ bản.

2

Nó là tốt hơn để đóng mỗi dòng mở riêng là tất cả đều là dòng riêng biệt. Nếu có một số lỗi xảy ra trong luồng lồng nhau thì luồng sẽ không đến gần. Vì vậy, tốt hơn hết nên đóng riêng từng luồng lồng nhau.

Để biết thêm chi tiết tham khảo theo liên kết:

Correct way to close nested streams and writers in Java

+0

Cảm ơn bạn đã liên kết trong câu hỏi này. Nhưng tôi không đồng ý rằng tốt hơn hết là đóng các nhà văn bên trong, bởi vì: 1) mệnh đề cuối cùng (như bạn thấy trong câu trả lời của tôi) đảm bảo rằng phương pháp đóng của nhà văn bên trong được gọi là 2) Trong trường hợp (hiếm) out.close() có thể ném một ngoại lệ, biến thành viên của nhà văn ra và cb không được đặt thành null, không có vấn đề gì vì chúng là đối tượng đơn giản (không phải tài nguyên hệ thống, ví dụ như xử lý tệp) – sambe

1

Bạn cần phải đóng suối ngoài cùng chỉ. phần còn lại của các luồng là tạm thời và sẽ tự động bị đóng. nếu bạn tạo riêng các luồng và sau đó lồng chúng lại, trong trường hợp đó bạn cần phải đóng luồng riêng lẻ. Kiểm tra Câu hỏi này cũng Correct way to close nested streams and writers in Java

+0

Không, bạn không 'cần đóng luồng riêng lẻ'. Bạn chỉ cần đóng luồng ngoài cùng. – EJP

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