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)
这取决于。
AnInputStream可以是缓冲的或非缓冲的,它可以在内部存储整个文件或不存储任何内容,它可以自由地执行所有这些操作。甚至可能存在与它们相关的本机资源。
不过,这种模式有一个更根本的问题:InputStream只有作为读取它们的过程的一部分才真正有意义。集中存储它们是一个坏主意,因为:
InputStream几乎总是以泪水结束。)FileInputStreams,它们将使文件保持打开状态,并且您可能会用完文件描述符。