有没有办法以编程方式解压缩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
答案 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);
}
}
}