如果它们通过java包装在缓冲区中,我是否必须明确关闭所有流?

3al*_*lto 5 java networking

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我今天遇到了这个问题,并且不确定它们是否会被关闭,因为它已被包裹,或者是否仍需要独立关闭所有流.

Ada*_*lik 8

如果任何读取器或流装饰另一个读取器/流,则关闭外部读取器/流也会关闭内部.这可以从Javadoc暗示Closeable#close():

关闭此流并释放与其关联的所有系统资源.

这也适用于底层资源.

如果你非常好奇,你可以深入研究这些课程的来源,例如.在BufferedReader:

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

in底层在哪里Reader.


and*_*ucz 5

是的,装饰的溪流也是封闭的.

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)
Run Code Online (Sandbox Code Playgroud)