用java怎么提取或是解压rar压缩文档?以前查了很多的资料,没有找到相关的第三方库,网上查找的资料说是解析rar只能更加rar的命令行参数来解析。因为rar压缩文档的内部结构是没有共开的。所以没有专门的解析库程序。自己也就只好用命令行了,但是在实际应用中,遇到rar加密时就遇到了问题。
所以自己又在网上很费心的找了相关资料,终于找到了一个库可以解析rar文档。
库下载地址:http://www.mucommander.com/。这是个解决多种文档的软件,是用java写的。所以能够引用来解决rar的解析。
package DOCExtract; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import DocHandler.DocTypeNameParse; import DocHandler.IDocHandler; import com.mucommander.file.AbstractFile; import com.mucommander.file.FileFactory; import com.mucommander.file.impl.rar.provider.RarFile; import com.mucommander.file.impl.rar.provider.de.innosystec.unrar.rarfile.FileHeader; /** * IDocHandler 为自己写的接口类 * */ public class RarExtractor implements IDocHandler { // 每次读取的字节大小 private int BLOCKSIZE = 1024; // 临时文件编号 private int FILE_COUNT = 0; public int getText(InputStream inputStream, StringBuffer strBuff) { String fileDir = "f://wang" + FILE_COUNT; FILE_COUNT++; String fileName = null; try { // 将文件写入磁盘上 writeTodev(inputStream, fileDir); // 从磁盘上读取文件 File file = new File(fileDir); String[] subFilePath = file.list(); fileName = fileDir + "//" + subFilePath[0]; AbstractFile abstractFile = FileFactory.getFile(fileName); RarFile rarFile = new RarFile(abstractFile); Collection collection = rarFile.getEntries(); IDocHandler docHandler = null; for (Iterator iterator = collection.iterator(); iterator.hasNext();) { FileHeader fileHeader = (FileHeader) iterator.next(); String subFileName = fileHeader.getFileNameString(); // 输出rar文档里的文档名 System.out.println("subFileName:" + subFileName); InputStream subinputStream = rarFile.getEntryInputStream(subFileName); /** * DocTypeNameParse为文自己写的文档类型判断类。 */ String fileType = DocTypeNameParse.getTypeName(subFileName); // 输出文档的类型 System.out.println("fileType:" + fileType); docHandler = (IDocHandler) this.ExctractMap.get(fileType); docHandler.getText(subinputStream, strBuff); subinputStream.close();//这里必须关闭流,否则在遇到有文档异常时,流就会卡主 } // System.out.println("strBuff:" + strBuff); } catch (IOException e) { e.printStackTrace(); } // 删除临时文件 deleteFile(fileDir); return 0; } // 将文件写入磁盘上 private void writeTodev(InputStream inputStream, String fileDir) { byte[] b = new byte[BLOCKSIZE]; int readCount = 0; try { File file = new File(fileDir); if (!file.exists()) file.mkdirs(); File subFile = new File(fileDir, "tempfile.rar"); FileOutputStream os = new FileOutputStream(subFile); while ((readCount = inputStream.read(b)) > 0) { os.write(b, 0, readCount); } os.close(); } catch (IOException e) { e.printStackTrace(); } } // 删除临时文件 private void deleteFile(String fileName) { File file = new File(fileName); File[] subFile = file.listFiles(); for (int i = 0; i < subFile.length; i++) { subFile[i].delete(); } file.delete(); } }