是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/