Java 将压缩文件与解压缩文件读入内存

Java 将压缩文件与解压缩文件读入内存,java,memory,Java,Memory,我有一个文件,以.zip格式提供,我想把它读入内存。压缩大约50MB,解压大约700MB。现在我想知道我是否应该先解压文件,然后再读取它,或者如果没有区别,我可以直接从zip文件读取数据 对于普通文件,我使用一个InputStreamReader包装在FileInputStream周围对于zip文件,我使用java.util.ZipFile从ZipEntry获取InputStream,然后再次在其周围包装InputStreamReader。 最后,我在这两种情况下都使用了InputStreamR

我有一个文件,以.zip格式提供,我想把它读入内存。压缩大约50MB,解压大约700MB。现在我想知道我是否应该先解压文件,然后再读取它,或者如果没有区别,我可以直接从zip文件读取数据

对于普通文件,我使用一个
InputStreamReader
包装在
FileInputStream
周围
对于zip文件,我使用
java.util.ZipFile
ZipEntry
获取
InputStream
,然后再次在其周围包装
InputStreamReader

最后,我在这两种情况下都使用了
InputStreamReader

我试图测试它,但在本地我无法读取这么大的文件而不耗尽内存。在进程运行的服务器上,有更多的进程干扰,因此我不太清楚是否有任何区别

有人知道吗,如果其中一个选项使用的内存比另一个要多得多,这仅仅是一个设计问题,应该使用哪种方式

您好,
Uwe

唯一的区别是解压缩文件的性能受到了很小的影响。在这两种情况下,
InputStreamReader
将读取未打包的700 MB文件


您应该问的下一个问题是,为什么需要将这个大文件完全读入内存?真的有必要吗?也许你可以一行一行地处理它,而不用把所有的行都保存在内存中。

你如何处理解压后的数据?zipfile有多少条目?这是您自己机器上的一次性作业,而不是生产机器上的常规作业吗?我们真的需要知道您必须如何处理数据。您可以在读取时对其进行过滤,只需要在内存中保存一个小的缓冲区和结果,或者您可以找到一种在磁盘上处理它的方法。应避免将其全部保存在内存中-除非这是一次性的。@wero包含csv文件。读取后,我根据一列的内容将单行分组,并将结果写回磁盘。一个文件最多可以包含60万行。@Andrewergan这是一个常规生产作业。我知道内存部分是一个关键部分,但是内存读取需要暂时停留,因为我们现在不能使用Java8。此外,我们也无法使用批处理,因为单个步骤是由单个soap微服务完成的。感谢您的回复。很高兴听到我的期望朝着正确的方向发展。我很想在这种情况下使用streams和lambas,但随着我们的架构的发展,现在还不可能做到这一点。请参阅我对问题的评论。为了减少内存消耗,您可以分两次处理该文件。在pass 1中,您仅将组列的值存储在类似
map
的映射中。这些值是组列中包含键的每行的文件位置。用这个你可以创建一个穷人指数。在第二步中,您迭代映射,可以一起读取一个组值的所有行。您需要一个
RandomAccessFile
,以便将文件指针定位到行首。