关闭 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 被释放,因为我需要尽快在其他流中使用它。
所以这里调用br的close()可以吗,还能用fis?
So is it okay to call br's close() here, and still can use fis?
没有!
一旦 br
包装了 fis
,fis
不应用于任何其他目的,因为 br
已经假设 fis
用于它和它单独做它想做的事。例如,它可以在构造过程中预先缓冲一些甚至全部 fis
。
将 fis
用于 br
以外的任何用途,不仅会产生不可预测的结果,而且很可能会严重干扰 br
的功能。
即使您所做的只是在创建后立即关闭 br
,fis
如果没有完全消耗,那么至少部分消耗是非常合理的 - 它也应该是关闭。
当我这样写的时候:
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 被释放,因为我需要尽快在其他流中使用它。
所以这里调用br的close()可以吗,还能用fis?
So is it okay to call br's close() here, and still can use fis?
没有!
一旦 br
包装了 fis
,fis
不应用于任何其他目的,因为 br
已经假设 fis
用于它和它单独做它想做的事。例如,它可以在构造过程中预先缓冲一些甚至全部 fis
。
将 fis
用于 br
以外的任何用途,不仅会产生不可预测的结果,而且很可能会严重干扰 br
的功能。
即使您所做的只是在创建后立即关闭 br
,fis
如果没有完全消耗,那么至少部分消耗是非常合理的 - 它也应该是关闭。