如果
FileInputStream fileIS = new FileInputStream(filePathStr);
DataInputStream dataIS = new DataInputStream(fileIS);
关闭 fileIS 会自动关闭 dataIS,因为 dataIS 是传播 fileIS 还是应该单独关闭 dataIS?
谢谢
如果有选择,您应该只关闭DataInputStream
. 更一般地说,总是关闭最外层的包装流。关闭将向内传播,这是通常确保正确行为的唯一方法。
但是,如果您关闭底层FileInputStream
,这也足够了,因为DataInputStream
它本身不会获取任何系统资源。
对您的问题最直接的回答:不,关闭底层流不会关闭包装流,但实际上从系统资源泄漏的角度来看,这无关紧要。只有底部的流与实际的系统资源耦合。
应该做相反的事情。由于 DataInputStream 包装了 FileInputStream,因此您应该关闭它,这也会关闭 FileInputStream。
该实现将负责关闭内部流。关闭最外面的流,否则在使用例如 BufferedOutputStream 时会出现问题,然后先关闭 OutputStream - 缓冲区中剩余的数据无法写入并丢失!
DataInputStream 扩展了 FilterInputStream 本身并没有实现 close() ,所以它是继承的。您所询问的行为在 FilterInputStream.close() 的合同中明确指定,因此 DataInputStream 必须遵守,FilterInputStream 的所有其他派生类也必须遵守。对于 FilterOutputStream、FilterReader 和 FilterWriter 的派生类也是如此。