【问题标题】:Closing an outermost stream object in Java在 Java 中关闭最外层的流对象
【发布时间】:2017-07-28 15:20:49
【问题描述】:

当我写这样的东西时:

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吗?

【问题讨论】:

  • 您还需要在什么其他流中使用它?为什么?那就是你的问题。
  • 你说“需要在其他流中使用它”是什么意思,你知道流不必支持返回吗?
  • @SotiriosDelimanolis 是的,你也许是对的。我不记得确切的情况,但是,不必像你说的那样做。但是我想知道在这种情况下会发生什么,因为我还在学习 Java,想知道它是如何工作的。
  • @luk2302 我不是故意粗鲁,但我经常看到这里的人只是说“你为什么要那样做?”并且不回答任何问题..我认为问一些好奇的东西并没有那么糟糕,如果它可以帮助某人很好地理解某事。这个地方不仅适合实用的编码员。我不知道,但不要那样做,因为那不是真正的答案..
  • 没有冒犯,没有什么粗鲁的,别担心。

标签: java stream fileinputstream


【解决方案1】:

那么这里可以调用br的close(),还能用fis吗?

不!

一旦br 包裹了fisfis 就不应用于任何其他目的,因为br 已假设fis 是为它而设计的,并且它只为它做它想做的事情。例如,它可以在构造过程中预缓冲部分甚至全部 fis

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 2022-01-22
    • 2012-02-04
    • 2018-05-03
    相关资源
    最近更新 更多