2015-12-03 14 views
5
private InputStream input; 
private InputStreamReader inputReader; 
private BufferedReader reader; 

try { 
    input = new InputStream(); 
    inputStreamReader = new InputStreamReader(inputStream); 
    reader = new BufferedReader(inputStreamReader); 
    // do I/O operations 
} catch (IOException e) { 
    Log.d("IOException", "The Data Could Not Be Read =/"); 
} finally { 
    try { 
     reader.close(); // now will this, by default, close all other streams? OR 
     /* 
     * input.close(); inputStream.close(); //is this necessary, along with 
     * reader.close(); 
     */ 
    } catch (IOException ex) { 
     ex.printStackTrace(); 
    } 
} 

Tôi đã xem câu hỏi này hôm nay và không chắc chắn liệu chúng có được đóng hay không, vì nó được gói hoặc nếu vẫn cần đóng tất cả các dòng một cách độc lập.Tôi có phải khám phá tất cả các luồng, nếu chúng được bao bọc trong bộ đệm qua java?

+0

Nó đóng tất cả các dòng liên quan ... nhưng nó wouldn' t làm tổn thương những người khác – 3kings

+2

@ 3kings - Vâng, tôi sẽ lập luận rằng mã dự phòng không làm tổn thương. Tốt hơn là dựa vào hợp đồng 'close()' hơn là thêm các cuộc gọi thêm vào mỗi trình đọc/luồng chỉ vì lợi ích của nó. –

Trả lời

8

Nếu bất kỳ trình đọc hoặc luồng nào trang trí một trình đọc/luồng khác, thì đóng trình đọc hoặc luồng bên ngoài cũng đóng bên trong. Điều này có thể ngụ ý từ Javadoc của Closeable#close():

Đóng dòng này và phát hành bất kỳ tài nguyên hệ thống liên kết với nó.

Điều đó cũng áp dụng cho các tài nguyên cơ bản.

Nếu bạn rất tò mò, bạn có thể tìm hiểu các nguồn của các lớp đó, ví dụ: trong BufferedReader:

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

nơi in là tiềm ẩn Reader.

5

Có, các luồng trang trí cũng bị đóng.

InputStream in = new FileInputStream("c:\\myfile.txt"); 
InputStreamReader reader = new InputStreamReader(in); 
BufferedReader bufferedReader = new BufferedReader(reader); 

bufferedReader.close(); 

in.read(); // throws an IOException (no such file or directory) 
reader.read(); // throws an IOException (Stream closed) 
4

Từ Java 7 bạn có thể sử dụng các khối try-với-tài nguyên (và thực tế là đóng reader đóng khác)

try (BufferedReader reader = new BufferedReader(
           new InputStreamReader(new FileInputStream(file), "UTF-8"))) { 

    // do I/O operations 
} catch(IOException e) { 
    Log.d("IOException", "The Data Could Not Be Read =/", e); 
} 
Các vấn đề liên quan