【问题标题】:Best way to compress files压缩文件的最佳方法
【发布时间】:2014-11-09 17:25:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 保持 zip 流打开不太可能在内存中缓冲(大量)内容,它会定期刷新缓冲区,但您也可以自己手动刷新缓冲区。至于天气有一个优势将归结为您的需求。首先处理所有 CSV 文件然后压缩它们可能会更好,因为从管理的角度来看,这可能更容易,这也意味着如果一个步骤失败,您最终不会得到一些损坏且无意义的文件。 ..
  • “巨大”到底是什么意思?
  • 正在处理数百万条记录

标签: java file csv zip


【解决方案1】:

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

http://fahdshariff.blogspot.com/2011/08/java-7-working-with-zip-files.html

http://docs.oracle.com/javase/7/docs/technotes/guides/io/fsp/zipfilesystemprovider.html

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

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

【讨论】:

  • 感谢您的回复。我们正在为我们的应用程序使用 java 1.6。有没有其他方法可以做到这一点?
  • 对不起,我没有在 Java 1.6 下使用 zip 的经验
【解决方案2】:

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

先创建一个csv文件,然后压缩它,将csv行直接写入输出流没有任何好处。这可以通过 java 1.6 轻松完成

如果它变得真的很大,您可能会遇到的唯一限制是 java 1.6 不支持 zip64,因此您被限制为 4gb。在某些时候,我将 1.7 的 zip 功能反向移植到 1.6 以解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2021-01-26
    相关资源
    最近更新 更多