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对象实际上执行读取操作,并且当我们调用readblock()时在内部调用TarArchiveInputStream.read(..)方法时,会从基础blockBuffer文件中将数据读入该tar中。


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


否。实际上,通常,每当我们调用inputStream的read方法时,如果流被缓冲,if就会尝试从应用程序缓冲区中获取数据。如果存在请求的数据,它将从缓冲区中为其提供服务。如果不是,它将向OS发出信号(通过陷阱)以从OS文件高速缓存/磁盘读取数据并将其复制到其缓冲区中。 (在不需要此复制的地方,内存映射文件有些不同,但是我们不会在讨论中将其混在一起)。

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


还是仅仅是一个指向文件的指针,什么都没有存储到内存中?


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

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

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

关于java - TarArchiveInputStream是缓冲的还是未缓冲的输入流?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36235621/

10-12 02:36