首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java压缩/解压缩大文件(>1 1gb)

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

Stack Overflow用户
提问于 2012-06-19 17:27:10
回答 2查看 4K关注 0票数 2

我用android做了一个应用程序,可以让用户压缩和解压缩文件,我用的是java.util.zip包。一切都很好。速度,文件是完全压缩和解压缩与目录一起。唯一的问题是应用程序无法压缩/解压缩大文件(大于1 1gb)。

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

To Compress a big file in a ZIP with Java

感谢您今后的帮助!:)

编辑:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-19 17:33:45

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

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

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

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

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

并且来自write方法:

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

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

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

票数 5
EN

Stack Overflow用户

发布于 2012-06-19 17:35:06

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

代码语言:javascript
复制
//After calculating the buffer size bufSize:
bufSize = Math.min(bufSize, MAXSIZE);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11098135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档