是TarArchiveInputStream buffered
还是unbuffered
inputstream
?
InputStream inputStream = new TarArchiveInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream(file))));
这个对象是否inputStream
将整个文件内部存储到堆内存中?还是只是一个指向文件的指针,什么都没有存储到内存中?
根据的源代码commons-compress.jar ver 1.4
,
当我们创建一个TarArchiveInputStream实例时会发生什么?
除了其他初始化外,创建的重要对象是TarBuffer对象的实例,该对象内部具有byte[] blockBuffer
默认大小(DEFAULT_RCDSIZE * 20)
,即512 * 20 = 10 KB。
该TarBuffer
对象实际上执行读取操作,并且随着我们调用TarArchiveInputStream.read(..)在内部调用readblock()方法,blockBuffer
从底层tar
文件读取数据。
TarArchiveInputStream的对象是否将整个文件内部全部存储到堆内存中?
否。实际上,通常,只要inputStream
流被缓冲,无论何时我们调用if的read方法都将尝试从应用程序缓冲中获取数据。如果存在请求的数据,它将从缓冲区中为其提供服务。如果不是,它将向OS发出信号(通过陷阱)以从OS文件高速缓存/磁盘读取数据并将其复制到其缓冲区中。(内存映射文件在不需要复制到其中的地方有所不同,但是在我们的讨论中我们不会将其混为一谈)。
即使在这种情况下也是如此TarArchiveInputStream
。当我们read
在TarArchiveInputStream
其上调用method时,将其委托给内部,inputStream
并且可以看到与上面相同的流程。
还是只是一个指向文件的指针,什么都没有存储到内存中?
在创建时,TarArchiveInputStream
我们将aninputStream
作为参数传递inputStream
,实际上,它是一个指向文件的指针(据我所知,它是* -nix OS中的inode编号,并指向实际的inode结构)。
它确实如前所述将内容存储到内存中,但没有将整个文件存储到内存中。读入内存的数据量取决于byte[]
传递给的while调用read(...)
方法的大小TarArchiveInputStream
。
另外,如果有帮助,这是我用来查看如何使用读取条目的链接TarArchiveInputStream
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句