关于流的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回答

好帮手慕小尤

2020-08-16

同学你好,如果按照同学的写的,只创建InputStream类型的流,则只关闭一个流即可。如果同学创建了不同的流,则需要按照顺序进行关闭(先打开的后关闭,后打开的先关闭)。如下所示:

    在输入流中,BufferedReader中引用了InputStreamReader,在InputStreamReader中引用了FileInputStream,应该先关闭被引用的流。这里关闭的顺序为fis,isr,br。

    在输出流中,BufferedWriter中引用了OutputStreamWriter,在OutputStreamWriter中引用了FileOuputStream,同理,应该先关闭被引用的流。这里关闭的顺序为fos,osw,bw。
http://img.mukewang.com/climg/5f38e337098f06b610730259.jpg

祝学习愉快!

0

0 学习 · 16556 问题

查看课程