关于流的close
来源:6-2 常见问题总结
易萧
2020-08-16 13:41:47
Java的流是采用装饰者模式来写的。
因而对于创建一个流而言:
InputStream input = new FileInputStream("TestFile");
input = new BufferedInputStream(input);
只有第一个是创建"产品",而后面的都是包装"产品",但不论怎么包装,都应该看成同一个产品,只是多了许多装饰。
所以,input应当看成一个流,而不是两个截然不同的流的拼接。
一个蛋糕加了点奶油,它还是同一个蛋糕。
既然是同一个东西,那买一个蛋糕的钱自然是包括奶油的,而不是分开算,这是一个整体。
同样,input.close()时,它关闭的就是自己,而不需要我们(也不应该)去先关闭BufferedInputStream,再关闭FileInputStream,而它的实现也的确如此,包装类已经帮我们做了。
课程中
ois.close(); fis.close(); oos.close(); fos.close();
fis.close()和fos.close()明显是多余的。
1回答
同学你好,如果按照同学的写的,只创建InputStream类型的流,则只关闭一个流即可。如果同学创建了不同的流,则需要按照顺序进行关闭(先打开的后关闭,后打开的先关闭)。如下所示:
在输入流中,BufferedReader中引用了InputStreamReader,在InputStreamReader中引用了FileInputStream,应该先关闭被引用的流。这里关闭的顺序为fis,isr,br。
在输出流中,BufferedWriter中引用了OutputStreamWriter,在OutputStreamWriter中引用了FileOuputStream,同理,应该先关闭被引用的流。这里关闭的顺序为fos,osw,bw。
祝学习愉快!
相似问题