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

Java压缩/解压缩大型文件(>;1gb),java,android,file,compression,Java,Android,File,Compression,我在android中开发了一个应用程序,允许用户压缩和解压缩文件,我使用了包java.util.zip。一切都很好。在速度方面,文件与目录一起被完全压缩和解压缩。唯一的问题是应用程序无法压缩/解压缩大文件(大于1gb) 我认为问题在于我的缓冲区的大小。我见过的其他代码,它们的缓冲区的值是1024或2048或8192,但我的缓冲区的值是基于所选文件的大小(只是为了使其灵活)。但是一旦用户选择了一个大文件(大小>8位),错误就会出现。我在网上搜索过,也在这个网站上搜索过,但我找不到答案。我的问题与此

我在android中开发了一个应用程序,允许用户压缩和解压缩文件,我使用了包
java.util.zip
。一切都很好。在速度方面,文件与目录一起被完全压缩和解压缩。唯一的问题是应用程序无法压缩/解压缩大文件(大于1gb)

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

谢谢你以后的帮助!:)

编辑:


谢谢你的评论和回答。这真的帮了大忙。我认为
BUFFER
在java中压缩/解压缩意味着文件的大小,所以在我的程序中,我使缓冲区大小灵活(BUFFER size=文件大小)。请有人解释一下缓冲区是如何工作的,这样我就能理解为什么
buffer
有一个固定值是可以的。我还想弄明白为什么其他人会说如果缓冲区大小为8k或其他值会更好。非常感谢!:)

如果将缓冲区的大小调整为文件的大小,则意味着每当文件大小太大而无法使用内存时,就会出现OutOfMemoryError

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

有关说明,请参见以下文件的示例:

该类实现了一个缓冲输出流。通过建立这样一个 输出流,应用程序可以将字节写入基础输出 流,而不一定导致对底层系统的调用 写入的每个字节

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

从方法上看:

通常,此方法将给定数组中的字节存储到 流的缓冲区,将缓冲区刷新到底层输出流 根据需要。如果请求的长度至少与此长度相同 但是,此方法将刷新缓冲区并 将字节直接写入底层输出流

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


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

听起来,为缓冲区设置一个最大大小会有帮助,比如:

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

请发布您的代码-尤其是选择缓冲区大小的部分。我怀疑你的缓冲区太大了。没有必要根据文件大小调整缓冲区大小。如果有什么不同的话,它需要调整以匹配它下面的I/O层。这很棘手,可能不便于携带。只要有一个固定的缓冲区大小。多项式,你的权利,这是我的情况。由于Thilo的评论,我意识到我误解了
buffer
的功能+给你们两个一个。这意味着一个固定值的缓冲区可以压缩/解压任何大小的文件?那么,不同缓冲区大小的目的是什么呢?1024、2048、8192等等?好的缓冲区大小大约是8KYep,这就是我的情况。OutOfMemoryError。你能给我解释一下缓冲区是如何工作的吗?因为我认为缓冲区的大小必须等于文件的大小。谢谢!康斯坦丁,谢谢你的建议!但是你能给我解释一下为什么我要有更好的理解。谢谢!:)为什么要使缓冲区更大?@Thilo不知道,大于8k的缓冲区通常没有什么好处。我只是假设John想要使用可变缓冲区,因为这就是他正在做的。