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

Joh*_*ohn 2 java compression android file

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

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

使用Java压缩ZIP中的大文件

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

编辑:

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

sud*_*ode 5

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

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

有关解释,请参阅BufferedOutputStream的文档:

该类实现缓冲输出流.通过设置这样的输出流,应用程序可以将字节写入基础输出流,而不必为写入的每个字节调用底层系统.

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

并从方法:

通常,此方法将来自给定数组的字节存储到此流的缓冲区中,根据需要将缓冲区刷新到基础输出流.但是,如果请求的长度至少与此流的缓冲区一样大,则此方法将刷新缓冲区并将字节直接写入基础输出流.

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

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