关闭 Java 中的最外层流对象

Closing an outermost stream object in Java

当我这样写的时候:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("c:\test.txt")));
br.close();

关闭最外面的对象,在本例中 br,也会自动关闭所有链接的对象。

但是如果仍然有对链接对象的引用怎么办?

像这样:

FileInputStream fis = new FileInputStream("c:\test.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis));
br.close();

在这种情况下,我不希望 fis 被释放,因为我需要尽快在其他流中使用它。

所以这里调用brclose()可以吗,还能用fis?

So is it okay to call br's close() here, and still can use fis?

没有!

一旦 br 包装了 fisfis 不应用于任何其他目的,因为 br 已经假设 fis 用于它和它单独做它想做的事。例如,它可以在构造过程中预先缓冲一些甚至全部 fis

fis 用于 br 以外的任何用途,不仅会产生不可预测的结果,而且很可能会严重干扰 br 的功能。

即使您所做的只是在创建后立即关闭 brfis 如果没有完全消耗,那么至少部分消耗是非常合理的 - 它也应该是关闭。