Java 压缩文件的最佳方法

Java 压缩文件的最佳方法,java,file,csv,zip,Java,File,Csv,Zip,我正在从DB读取不同的数据块,并将每个数据块写入CSV文件,然后将该条目添加到zip文件中。以下是我的问题: 我正在处理大量数据,是否建议在事务开始时打开zip流,在事务结束时关闭?如果我这样做,它会将所有这些数据保存在RAM中并导致内存问题吗 如果我将这些csv文件保存在硬盘中,并在交易结束时将其压缩,会有什么好处吗?如果是这样的话,用java实现它的最佳方法是什么 注意:我们的应用程序使用的是Java 1.6。看看Java 7引入的新文件系统 这允许您像处理文件系统一样处理zip文件,只

我正在从DB读取不同的数据块,并将每个数据块写入CSV文件,然后将该条目添加到zip文件中。以下是我的问题:

  • 我正在处理大量数据,是否建议在事务开始时打开zip流,在事务结束时关闭?如果我这样做,它会将所有这些数据保存在RAM中并导致内存问题吗

  • 如果我将这些csv文件保存在硬盘中,并在交易结束时将其压缩,会有什么好处吗?如果是这样的话,用java实现它的最佳方法是什么


  • 注意:我们的应用程序使用的是Java 1.6。

    看看Java 7引入的新文件系统

    这允许您像处理文件系统一样处理zip文件,只需将数据直接复制或写入zip文件内的文件。但是,zip文件系统不支持Path.toFile()方法,因此对于所有需要文件对象的旧代码,您需要创建一个临时文件,然后将其复制过来


    对于您的应用程序,您可以只使用Files.newBufferedWriter(…)之类的东西将文件直接写入zip存档,而不必担心具体细节。

    确保ZipOutputStream环绕在内存中不存在的输出流(如FileOutputStream)周围。这将使内存消耗保持在最低限度,您基本上可以一直写到文件系统满为止

    首先创建一个csv文件,然后压缩它,将csv行直接写入outputstream,没有任何好处。使用Java1.6很容易做到这一点


    如果它变得越来越大,您可能会遇到的唯一限制是Java1.6不支持zip64,因此您被限制为4gb。为了解决这个问题,我将1.7到1.6的zip功能进行了后端口移植。

    保持zip流打开不太可能在内存中缓冲(大量)内容,它会定期刷新缓冲区,但您也可以自己手动刷新缓冲区。至于天气,优势将取决于你的需要。最好先处理所有CSV文件,然后压缩它们,因为从管理的角度来看,这可能会更容易,这也意味着如果一步失败,你不会得到一些损坏的、毫无意义的文件……那么“巨大”到底意味着什么呢?我正在处理数百万条记录谢谢你的回复。我们的应用程序使用Java1.6。还有其他方法吗?对不起,我没有Java 1.6下的ZIP经验