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