gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:00:25 24 4
gpt4 key购买 nike

我有一个 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);
}
}

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

BlockingQueue<String> queue   = new LinkedBlockingQueue<Sample>(10000);

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

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

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

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

更新:

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

InputStream is = new TarArchiveInputStream(new GZIPInputStream(new BufferedInputStream(new FileInputStream(file))));

最佳答案

视情况而定。

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

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

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

关于java - 如果我将 InputStream 的对象保存到内存中,是否意味着我将整个文件存储到内存中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36234982/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com