【问题标题】:Is TarArchiveInputStream buffered or unbuffered inputstream?TarArchiveInputStream 是缓冲的还是非缓冲的输入流?
【发布时间】:2016-07-14 03:14:35
【问题描述】:

TarArchiveInputStreambuffered还是unbufferedinputstream

InputStream inputStream = new TarArchiveInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream(file))));

inputStream 的这个对象是否将整个文件内部存储到堆内存中?或者它只是一个指向文件的指针并且什么都不存储到内存中?

【问题讨论】:

    标签: java inputstream heap-memory


    【解决方案1】:

    基于commons-compress.jar ver 1.4的源码,

    当我们创建一个 TarArchiveInputStream 实例时会发生什么?

    除了其他初始化之外,创建的重要对象是TarBuffer对象的一个​​实例,该对象内部有一个byte[] blockBuffer,其默认大小为(DEFAULT_RCDSIZE * 20),即512*20 = 10 KB。

    这个TarBuffer 对象实际上执行读取操作,并且在我们调用TarArchiveInputStream.read(..) 时,内部调用了readblock() 方法从底层tar 文件到这个blockBuffer 中的数据@

    TarArchiveInputStream 对象是否将整个文件内部存储到堆内存中?

    没有。事实上,一般来说,每当我们调用inputStream 的read 方法时,如果流被缓冲,就会尝试从应用程序缓冲区中获取数据。如果请求的数据存在,它会从缓冲区提供它。如果不是,它会通知操作系统(通过陷阱)从操作系统文件缓存/磁盘中读取数据并将其复制到其缓冲区中。 (内存映射文件在不需要复制的地方有点不同,但我们不会在讨论中混合使用)。

    即使在TarArchiveInputStream 的情况下也是如此。当我们在TarArchiveInputStream 上调用read 方法时,它会委托给内部inputStream,并且可以将上述相同的流程可视化。

    或者它只是一个指向文件的指针并且什么都不存储到内存中?

    在创建TarArchiveInputStream 时,我们将inputStream 作为参数传递,而inputStream 实际上是一个指针(据我回忆,它位于*-nix OS 中的inode 编号和points到实际的 inode 结构)到文件。

    它确实将内容存储到内存中,如前所述,但不是整个文件。将多少数据读入内存取决于在TarArchiveInputStream 上调用read(...) 方法时传递给byte[] 的大小。

    另外,如果有帮助,这是我用来查看如何使用TarArchiveInputStream 读取条目的link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-19
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-29
      • 2014-01-30
      相关资源
      最近更新 更多