我正在从DB中读取不同的数据块,并将每个块写入CSV文件并将该条目添加到zip文件中。以下是我的问题:
我正在处理大量数据,是否建议在开始时打开zip流并在交易结束时关闭?如果我这样做,它会将所有这些数据保存在RAM中并导致任何内存问题吗?
如果我将这些csv文件保存在硬盘驱动器中并在事务结束时将其压缩,是否会有任何优势?如果是这样,在java中最好的方法是什么?
注意:我们将Java 1.6用于我们的应用程序。
答案 0 :(得分: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存档,而不必担心具体细节。
答案 1 :(得分:0)
确保ZipOutputStream包裹在不在内存中的输出流(如FileOutputStream)。这将使内存消耗降至最低,基本上可以写入,直到文件系统已满。
首先创建一个csv文件,然后压缩它,将csv行直接写入输出流没有任何好处。这可以使用java 1.6
轻松完成如果真的大,你可能遇到的唯一限制是java 1.6不支持zip64,因此你只能限制在4GB。在某些时候,我向后移植了1.7到1.6的zip功能来解决这个问题。