2016-03-26 61 views

回答

1

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

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

除了其他初始化,时生成的重要目的是TarBuffer对象,它内部具有byte[] blockBuffer其默认大小为(DEFAULT_RCDSIZE * 20) i..e,512 * 20 = 10 KB的一个实例。

TarBuffer对象实际执行读取操作和数据到这个blockBuffer从底层tar文件作为readblock()方法被调用内部,我们调用TarArchiveInputStream.read(..)

是否TarArchiveInputStream的对象存储整个整个文件内部进入堆内存?

号实际上,在一般情况下,只要我们叫inputStream的读取方法,如果将尽力流缓冲从应用程序缓冲区获取数据。如果请求的数据存在,它将从缓冲区提供它。如果没有,则通知操作系统(通过陷阱)从OS文件缓存/磁盘读取数据并将其复制到其缓冲区中。 (内存映射文件在不需要复制的地方有点不同,但我们不会在讨论中混合使用)。

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

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

在创建TarArchiveInputStream我们传递一个inputStream作为参数,这是inputStream,事实上,一个指针(据我可以记得,它是在* -nix OS和点inode编号,以实际inode结构)到文件。

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

此外,如果有帮助,这是我用来看TarArchiveInputStream如何阅读条目的link