如果
FileInputStream fileIS = new FileInputStream(filePathStr);
DataInputStream dataIS = new DataInputStream(fileIS);
关闭文件是否会自动关闭数据IS ,因为日期是传播fileIS还是dataIS也应该单独关闭?
由于
答案 0 :(得分:7)
如果给出选择,则应仅关闭DataInputStream
。更一般地,始终关闭最外层的包装流。结束将向内传播,这是通常确保正确行为的唯一方法。
但是,如果您关闭基础FileInputStream
,那也就足够了,因为DataInputStream
本身并不获取任何系统资源。
您问题的最直接答案:不,关闭基础流不会关闭包装器流,但实际上从系统资源泄漏的角度来看这是无关紧要的。只有底部的流耦合到实际的系统资源。
答案 1 :(得分:2)
应该做相反的事情。由于DataInputStream包装了FileInputStream,您应该关闭它,这也会关闭FileInputStream。
答案 2 :(得分:2)
实现将关闭内部流。关闭最外面的流,否则你可能会遇到问题,例如使用例如BufferedOutputStream并首先关闭OutputStream - 缓冲区中剩余的数据无法写入并丢失!
答案 3 :(得分:0)
DataInputStream扩展了FilterInputStream,并且本身并不实现close(),因此它是继承的。您询问的行为是在FilterInputStream.close()的合同中明确指定的,DataInputStream因此必须遵守,而FilterInputStream的所有其他派生类也必须遵守。类似地,对于FilterOutputStream,FilterReader和FilterWriter的派生类。