Android以编程方式解压缩RAR文件

时间:2011-05-01 16:19:10

标签: android

有没有办法以编程方式解压缩android 1.6中的rar文件?

我已经尝试过JUNRAR,但有一些例外...

这是我的代码,在使用junrar库成功打开rar文件之后:

FileHeader fh=null;
  while(true)
  {
   fh=rar.nextFileHeader();
   if(fh==null) return false;    
   if(fh.isEncrypted()) continue;     
   //check file

   if(!fh.isDirectory() && fh.getFileNameString().toLowerCase().endsWith(".jpg")) 
   {
    try 
    {
      File f=new File(tmppath+covername);      //name of the destination file

      OutputStream stream = new FileOutputStream(f);            
      rar.extractFile(fh, stream);         //call junrar    

      stream.close();
      return true;
     } 
     catch (FileNotFoundException e1) 
     {
        // TODO Auto-generated catch block
         return false;
     }
     catch (RarException e) 
     {
      // TODO Auto-generated catch block
         return false;
     } 
     catch (IOException e) 
     {
        // TODO Auto-generated catch block
         return false;
     }    
   }

DDMS透视图显示此异常......?

ERROR/AndroidRuntime(2733): Uncaught handler: thread Thread-9 exiting due to uncaught exception

ERROR/AndroidRuntime(2733): java.lang.VerifyError: de.innosystec.unrar.unpack.ppm.SubAllocator

ERROR/AndroidRuntime(2733): at de.innosystec.unrar.unpack.ppm.ModelPPM.<init>(ModelPPM.java:73)

ERROR/AndroidRuntime(2733): at de.innosystec.unrar.unpack.Unpack.<init>(Unpack.java:43)

ERROR/AndroidRuntime(2733): at de.innosystec.unrar.Archive.doExtractFile(Archive.java:456)

ERROR/AndroidRuntime(2733): at de.innosystec.unrar.Archive.extractFile(Archive.java:440)

ERROR/AndroidRuntime(2733): at com.pmc.myRar.unrarCover(myRar.java:164)

ERROR/AndroidRuntime(2733): at com.pmc.myDataBase.addRar(myDataBase.java:541)

ERROR/AndroidRuntime(2733): at com.pmc.libraryActivity.addtoDB(libraryActivity.java:306)

ERROR/AndroidRuntime(2733): at com.pmc.libraryActivity$2.run(libraryActivity.java:240)

ERROR/AndroidRuntime(2733): at java.lang.Thread.run(Thread.java:1060)

谢谢, PMC

3 个答案:

答案 0 :(得分:4)

您遇到了java.lang.Verify错误,很难确定。是否有自己重新编译的库的源代码?可能是库是使用另一个jar的不同版本编译的。

作为解决方法:

这里有一个C库:http://www.unrarlib.org/download.html,它有一个指向JNI接口的链接

另一种(非常简单的)替代方法是将Runtime.exec()与此可执行文件一起使用:http://forum.xda-developers.com/showthread.php?t=1015814

答案 1 :(得分:0)

如果您使用JUNRAR库,则在解压缩大型rar文件时会遇到“Out of memory”错误。

答案 2 :(得分:0)

你可以使用src,改变功能&#34; doExtractFile&#34; archive.java 添加代码             dataIO.endpack();             解压= NULL;

例如

private void doExtractFile(FileHeader hd,OutputStream os)

        throws RarException, IOException {
    dataIO.init(os);
    dataIO.init(hd);
    dataIO.setUnpFileCRC(this.isOldFormat() ? 0 : 0xffFFffFF);
    if (unpack == null) {
        unpack = new Unpack(dataIO);
    }
    if (!hd.isSolid()) {
        unpack.init(null);
    }
    unpack.setDestSize(hd.getFullUnpackSize());
    try {
        unpack.doUnpack(hd.getUnpVersion(), hd.isSolid());
        // Verify file CRC
        hd = dataIO.getSubHeader();
        long actualCRC = hd.isSplitAfter() ? ~dataIO.getPackedCRC()
                : ~dataIO.getUnpFileCRC();
        int expectedCRC = hd.getFileCRC();
        if (actualCRC != expectedCRC) {
            throw new RarException(RarExceptionType.crcError);
            // System.out.println(hd.isEncrypted());
        }

        dataIO.endpack();//add yzd
        unpack=null;// add yzd

    } catch (Exception e) {
        unpack.cleanUp();
        if (e instanceof RarException) {
            // throw new RarException((RarException)e);
            throw (RarException) e;
        } else {
            throw new RarException(e);
        }
    }
}