2

我在 android 中制作了一个应用程序,可以让用户压缩和解压缩文件,我使用了 package java.util.zip。一切正常。速度,文件与目录一起完全压缩和解压缩。唯一的问题是应用程序无法压缩/解压缩大文件(大于 1gb)。

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

使用 Java 压缩 ZIP 中的大文件

感谢您未来的帮助!:)

编辑:

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

4

2 回答 2

5

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

使用正常的缓冲区大小并让它发挥作用 - 以流方式缓冲数据,一次一个块,而不是一次全部缓冲。

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

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

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

而从write方法:

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

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

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

于 2012-06-19T09:33:45.263 回答
1

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

//After calculating the buffer size bufSize:
bufSize = Math.min(bufSize, MAXSIZE);
于 2012-06-19T09:35:06.150 回答