TarArchiveInputStream是缓冲还是无缓冲的输入流?

时间:2016-03-26 13:02:57

标签: java inputstream heap-memory

TarArchiveInputStream bufferedunbuffered inputstream

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

inputStream的这个对象是否将整个文件内部存储到堆内存中?或者它只是一个指向文件的指针,并没有存储在内存中?

1 个答案:

答案 0 :(得分:1)

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

  

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

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

这个TarBuffer对象实际执行读取操作,并且数据从基础blockBuffer文件中传入此tar,因为readblock()方法在我们调用时被内部调用{{3 }}

  

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

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

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

  

或者它只是指向文件的指针并且不会将任何内容存储到内存中?

创建TarArchiveInputStream时,我们传递inputStream作为参数,而inputStream实际上是一个指针(据我所知,它在inode数字中) * -nix OS并指向文件的实际inode结构。

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

此外,如果有帮助,我使用TarArchiveInputStream.read(..)来查看如何使用TarArchiveInputStream读取条目。