Java压缩/解压缩大文件(> 1gb)

时间:2012-06-19 09:27:10

标签: java android file compression

我在android中创建了一个应用程序,允许用户压缩和解压缩文件,我使用了包java.util.zip。一切正常。速度,文件与目录一起完全压缩和解压缩。唯一的问题是应用程序无法压缩/解压缩大文件(大于1GB)。

我认为问题是buffer的大小。我见过的其他代码,缓冲区的值是1024或2048或8192,但我的缓冲区值取决于所选文件的大小(只是为了使其灵活)。但是一旦用户选择了一个大文件(大小为> 8位),就会出现错误。我在网上搜索,也在这个网站搜索,但我找不到答案。我的问题与此类似:

To Compress a big file in a ZIP with Java

感谢您对未来的帮助! :)

编辑:

感谢您的评论和答案。它真的帮了很多忙。我认为BUFFER在java中压缩/解压缩意味着文件的大小,所以在我的程序中,我使缓冲区大小灵活(缓冲区大小=文件大小)。有人请解释缓冲区是如何工作的,这样我就能理解为什么BUFFER具有固定值是可以的。同样让我弄清楚为什么其他人会告诉他们如果缓冲区大小为8k或者更好。非常感谢! :)

2 个答案:

答案 0 :(得分:5)

如果将缓冲区的大小调整为文件的大小,则表示只要文件大小太大而无法使用可用内存,就会出现OutOfMemoryError。

使用正常的缓冲区大小让它完成工作 - 以流式方式缓冲数据,一次缓冲一个块,而不是一次性缓冲。

有关说明,请参阅BufferedOutputStream的文档:

  

该类实现缓冲输出流。通过设置这样一个   输出流,应用程序可以将字节写入底层输出   流不必导致对底层系统的调用   写下每个字节。

因此,使用缓冲区比非缓冲写入更有效。

来自write方法:

  

通常,此方法将给定数组中的字节存储到此中   stream的缓冲区,将缓冲区刷新到底层输出流   如所须。如果要求的长度至少与此一样大   然而,流的缓冲区,然后这个方法将刷新缓冲区和   将字节直接写入底层输出流。

每次写入都会导致内存缓冲区填满,直到缓冲区已满。当缓冲区已满时,将刷新并清除它。如果使用非常大的缓冲区,则会在刷新之前将大量数据存储在内存中。如果您的缓冲区与输入文件的大小相同,那么您说在刷新之前需要将整个内容读入内存。使用默认缓冲区大小通常很好。将有更多的物理写入(刷新);你避免爆炸记忆。

通过允许您指定特定的缓冲区大小,API允许您在内存消耗和I / O之间选择适当的平衡以适合您的应用程序。如果您调整应用程序的性能,最终可能会调整缓冲区大小。但是在许多情况下,默认大小是合理的。

答案 1 :(得分:1)

听起来简单地设置缓冲区的最大大小会有所帮助,例如:

//After calculating the buffer size bufSize:
bufSize = Math.min(bufSize, MAXSIZE);