TarArchiveInputStream buffered
或unbuffered
inputstream
?
InputStream inputStream = new TarArchiveInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream(file))));
inputStream
的这个对象是否将整个文件内部存储到堆内存中?或者它只是一个指向文件的指针,并没有存储在内存中?
答案 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
读取条目。