如果我将 InputStream 的对象保存在内存中,那么是否意味着我将整个文件存储到内存中?

Ash*_*oli 5 java inputstream file heap-memory

我有一个Sample有两个构造函数的类。一个接受一个对象File而另一个接受一个InputStream.

package org.xyz.core;

    import java.io.File;
    import java.io.InputStream;

    /**
     * Created by Ashish Pancholi on 26-03-2016.
     */
    public class Sample {

        File file;

        public Sample(File file){
            this.file=file;
        }

        public Sample(InputStream inputStream){
            this.file = createFileFromInputStream(inputStream);
        }
    }
Run Code Online (Sandbox Code Playgroud)

我正在使用LinkedBlockingQueue它消耗一个 Sample 对象,深度为 10000;

BlockingQueue<String> queue   = new LinkedBlockingQueue<Sample>(10000);
Run Code Online (Sandbox Code Playgroud)

让我们在这里假设两种情况:

案例 A:Sample通过InputStream作为参数传递来初始化这么多类的实例,并将所有这些对象推送到LinkedBlockingQueue.

案例 B:Sample通过将File对象作为参数传递来初始化了许多类的实例,并将所有这些对象推送到LinkedBlockingQueue.

在哪种情况下我的程序会占用更多内存?如果我将 InputStream 的对象保存在内存中,那么是否意味着我将整个文件存储到内存中?如果我有这么多大文件怎么办?

更新:

请注意:我正在InputStream通过这种方式创建:

InputStream is = new TarArchiveInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream(file))));
Run Code Online (Sandbox Code Playgroud)

biz*_*lop 3

这取决于。

AnInputStream可以是缓冲的或非缓冲的,它可以在内部存储整个文件或不存储任何内容,它可以自由地执行所有这些操作。甚至可能存在与它们相关的本机资源。

不过,这种模式有一个更根本的问题:InputStream只有作为读取它们的过程的一部分才真正有意义。集中存储它们是一个坏主意,因为:

  1. 它们不是线程安全的。(多线程阅读遗嘱InputStream几乎总是以泪水结束。)
  2. 如果我们谈论FileInputStreams,它们将使文件保持打开状态,并且您可能会用完文件描述符。