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

Java 如果我将InputStream的对象保存在内存中,那么这是否意味着我正在将整个文件存储到内存中?,java,file,inputstream,heap-memory,Java,File,Inputstream,Heap Memory,我有一个类Sample,它有两个构造函数。一个接受文件的对象,而另一个接受输入流 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 S

我有一个类
Sample
,它有两个构造函数。一个接受
文件
的对象,而另一个接受
输入流

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);
        }
    }
我使用的是
LinkedBlockingQueue
,它使用一个样本对象,深度为10000

BlockingQueue<String> queue   = new LinkedBlockingQueue<Sample>(10000);
视情况而定

一个
InputStream
可以是缓冲的或非缓冲的,它可以在内部存储整个文件,也可以什么都不存储,所有这些都可以自由完成。甚至可能有与之关联的本地资源

不过,这种模式还有一个更基本的问题:
InputStream
s只在读取它们的过程中才有意义。将它们集中存储是个坏主意,因为:

  • 它们不是线程安全的。(从
    InputStream
    读取的多个线程几乎总是以眼泪结束。)
  • 如果我们谈论的是
    FileInputStream
    s,它们将保持文件打开,您可能会用完文件描述符

  • @AshishPancholi您指的是
    Inputstream
    的哪个子类?将
    Inputstream
    存储为字段是不明智的;谁负责关闭它们?你怎么能保证他们会继续营业?但是,除非您正在将文件读入一个
    ByteArrayInputStream
    ,否则内存就不重要了。@MadhusudanaReddySunnapu当然可以。这不是抽象的要点吗?@Boristespider是的,tt可以是InputStream的任何子类。我想看看OP使用的是缓冲流还是非缓冲流。@MadhusudanaReddySunnapu重点是,您提出的任何参数都必须适用于所有子类。它可能是缓冲的,也可能是无缓冲的,也可能连接到套接字。如果类型为原始
    InputStream
    ,则不能进行任何假设。OP当前分配给
    InputStream
    的内容既不在这里也不在那里,因为它可能会改变。确切地说,将
    InputStream
    存储为字段是个坏主意,原因有很多。内存可能是暂时的问题。我已经更新了我的问题,并试图理解我正在使用的
    InputStream
    是缓冲的还是非缓冲的?它是这样来的:
    InputStream is=new-TarArchiveInputStream(new-GZIPInputStream(new-BufferedInputStream(new-FileInputStream(file)))
    @AshishPancholi此答案仍然有效-不要将
    InputStream
    存储为字段。@boristeider好的。谢谢我只是想知道更多关于
    TarArchiveInputStream
    InputStream is = new TarArchiveInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream(file))));