如何在内存不足的情况下解压缩Android应用程序中的RAR文件?

时间:2014-06-09 04:50:11

标签: java android rar

我正在编写一个Android应用程序,用于在 JunRar 库的帮助下解压缩RAR文件。但在解压缩某些类型的RAR文件时,会出现内存不足的情况。

请有人帮我解决这个问题。

我知道, JunRar 库存在问题,但如果有人找到解决方案,请告知我们。

我的分析:

如果使用PPM算法压缩RAR文件,则会发生内存不足异常,因为尝试分配的内存比Android设备VM多。

startSubAllocator分配的内存比Android VM多new byte [100] MB个字节。这超过了96 MB Android VM的可用内存。

附加日志

java.lang.OutOfMemoryError

com.github.junrar.unpack.ppm.SubAllocator.startSubAllocator(SubAllocator.java:146)
com.github.junrar.unpack.ppm.ModelPPM.decodeInit(ModelPPM.java:216)
com.github.junrar.unpack.Unpack.readTables(Unpack.java:656)
com.github.junrar.unpack.Unpack.unpack29(Unpack.java:165)
com.github.junrar.unpack.Unpack.doUnpack(Unpack.java:120)
com.github.junrar.Archive.doExtractFile(Archive.java:500)
com.github.junrar.Archive.extractFile(Archive.java:442)
com.github.junrar.testutil.ExtractArchive.extractArchive(ExtractArchive.java:73)
com.github.junrar.testutil.ExtractArchive.extractArchive(ExtractArchive.java:29)
com.letusread.util.DeCompressUtil.deCompress(DeCompressUtil.java:140)
com.letusread.activity.FileListActivity$7.run(FileListActivity.java:338)
java.lang.Thread.run(Thread.java:856)

2 个答案:

答案 0 :(得分:1)

WinRAR的帮助包含标题为高级压缩参数的页面上的说明:

  

文字压缩/要使用的内存,MB
  为PPM分配的内存(兆字节)(可以是1-128)。较高的值可能会提高压缩率,但请注意PPM使用相同的内存大小进行压缩和解压缩,因此如果在创建存档时分配了太多内存,则在安装内存较少的计算机上解压缩时,其他人可能会遇到问题。如果此字段设置为0,WinRAR将自动选择内存大小。

标题为 Switch -MC - 设置高级压缩参数的帮助页面和文本文件 Rar.txt (控制台版本手册)包含有关内存要求的类似声明高级文本压缩。

解压缩使用128 MB内存使用的高级文本压缩创建的RAR存档需要128 MB的空闲(甚至连续)内存。如果没有足够的可用内存,则无法从这样的RAR存档中提取文件。


文本文件 Rar.txt 还包含有关压缩和解压缩时实体存档的内存要求的信息(切换-md):

  

对于RAR 4.x存档格式,字典大小可以是:
  64 KB,128 KB,256 KB,512 KB,1 MB,2 MB,4 MB。

     

对于RAR 5.0存档格式,字典大小可以是:
  128 KB,256 KB,512 KB,1 MB,2 MB,4 MB,8 MB,16 MB,32 MB,64 MB,128 MB,256 MB,512 MB,1 GB。

     

归档时,RAR需要大约6倍的指定字典大小的内存,因此512 MB和1 GB大小仅在64位RAR版本中可用。在提取时,分配的字典大小略多于一个,因此32位和64位版本都可以解压缩包含所有字典的存档,包括1 GB。


回答您的问题:如果在使用过多内存且没有足够的可用内存进行解压缩的Windows PC上创建RAR存档,则无法在应用程序中执行任何操作。那些RAR档案的内存使用量较少的替代解压缩算法不存在。

答案 1 :(得分:1)

事实上,它似乎是一个实施的错误。这是我使用的解决方法,以避免此问题:

在com.github.junrar.unpack.ppm.ModelPPM.java中,第196行:MaxMB = unpackRead.getChar();

方法getChar,在一些奇怪的情况下,返回一个非常大的数字。这应该是由于junrar不支持断页或头选项。

我的解决方法是检查MaxMB是否大于1并设置为1.我已经使用此修复程序很长一段时间没有问题。

int MaxMB = 0; if (reset) {
    MaxMB = unpackRead.getChar();
    if (MaxMB > 1) { //Workaround
        MaxMB = 1;
    }
}