现在的位置: 首页 > 综合 > 正文

java提取rar文档中的文本数据

2018年01月30日 ⁄ 综合 ⁄ 共 2574字 ⁄ 字号 评论关闭

用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();
    }
}

 

抱歉!评论已关闭.