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))));