代码之家  ›  专栏  ›  技术社区  ›  Illarion Kovalchuk

许多嵌套的BufferedInputStream-有什么影响?

  •  0
  • Illarion Kovalchuk  · 技术社区  · 15 年前

    有一个共同的模式,当应用程序的每一层处理一个流中的数据时,都倾向于将其包装成一个BufferedInputStream,因此总体上,有很多缓冲区,从缓冲区填充,从缓冲区填充等等。

    3 回复  |  直到 15 年前
        1
  •  3
  •   David    15 年前

    这是一个非常普遍的问题,但我要说的是,有很多层缓冲输入流(在任何语言中)都有很多问题。

    • 每个缓冲区占用内存,即使它没有被填满。因此,即使数据被直接吸到顶层,内存仍然被不必要地使用(注意:我假设Java不会自动调整缓冲区大小或其他任何东西—而且我不是Java专家。)
    • 无论何时从顶级缓冲区读取,都会引发一大串方法调用。方法调用涉及间接寻址(即指针跟踪)、数据传递(这可能导致缓存性能差)等等。

    只是对这件事的一些想法。我相信有更好的Java知识的人可以提供更详细的分析。

        2
  •  1
  •   Fish    15 年前

    由于额外的缓冲区,它会增加内存占用,但我怀疑,考虑到可能涉及的大小,它实际上会对给定的程序产生重大影响。这是一条标准规则,在你需要优化之前不要尝试优化。

    这完全取决于它被使用了多少,如果有很多大的链条它可能是一个问题,但我认为它不太可能是一个问题。

    正如David所说,这可能是设计糟糕的一个迹象,组件能够直接共享更复杂的对象可能会更有效,但这完全取决于具体的用途(我很难想到这样使用多个缓冲流的原因)。

        3
  •  1
  •   user207421    15 年前

    这确实是非常糟糕的做法,而且确实会导致错误。如果方法A执行一些读取,然后将流传递给方法B,方法B附加一个BufferedInputStream并执行更多的读取,则BufferedInputStream将填充其缓冲区,这可能会消耗方法B返回时方法A预期仍在那里的数据。方法B的缓冲输入流提前读取可能会丢失数据。

    推荐文章