2

如果

FileInputStream fileIS = new FileInputStream(filePathStr);
DataInputStream dataIS = new DataInputStream(fileIS);

关闭 fileIS 会自动关闭 dataIS,因为 dataIS 是传播 fileIS 还是应该单独关闭 dataIS?

谢谢

4

4 回答 4

6

如果有选择,您应该只关闭DataInputStream. 更一般地说,总是关闭最外层的包装流。关闭将向内传播,这是通常确保正确行为的唯一方法。

但是,如果您关闭底层FileInputStream,这也足够了,因为DataInputStream它本身不会获取任何系统资源。

对您的问题最直接的回答:不,关闭底层流不会关闭包装流,但实际上从系统资源泄漏的角度来看,这无关紧要。只有底部的流与实际的系统资源耦合。

于 2012-10-12T20:18:24.083 回答
2

应该做相反的事情。由于 DataInputStream 包装了 FileInputStream,因此您应该关闭它,这也会关闭 FileInputStream。

于 2012-10-12T20:19:38.757 回答
2

该实现将负责关闭内部流。关闭最外面的流,否则在使用例如 BufferedOutputStream 时会出现问题,然后先关闭 OutputStream - 缓冲区中剩余的数据无法写入并丢失!

于 2012-10-12T20:22:37.207 回答
0

DataInputStream 扩展了 FilterInputStream 本身并没有实现 close() ,所以它是继承的。您所询问的行为在 FilterInputStream.close() 的合同中明确指定,因此 DataInputStream 必须遵守,FilterInputStream 的所有其他派生类也必须遵守。对于 FilterOutputStream、FilterReader 和 FilterWriter 的派生类也是如此。

于 2012-10-13T01:15:40.193 回答