java解析rar压缩文档

最近做项目,要提取rar压缩文档中的文本内容,方法接口为:

int 为返回rar文件是否加密。
is为rar文件输入流。
textBuf为保存解析rar文档内的全部文档内容。

public int getText(InputStream is, StringBuffer textBuf){ }

java里面没有提供解析rar文档的类库,后来才知道,WinRAR 使用是需要付费的,并不是免费使用的。

由于 RAR 的专利性,没有专门的开源框架来解析 RAR 文档。

所以就只好用rar的命令来解析了。

具体做法是,根据输入进来的流把,该流表示的文件写入系统硬盘中。然后再用rar的命令来解析。这个方法看起来比较复杂,不过也只有这样了。

代码为:

package RarExtract;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* 这里之所以要先把文件写入系统磁盘上,是因为外面只需要调用我这里的getext方法。
* 而getext只接受流为参数。这里没有把整个程序完全写出来,
* 只是在这里说明我这程序的思想。所以也没有经过测试。不过我的实际程序是这样写的,
* 也测试过是能达到要求的。
* @author Administrator
*
*/
public class RarExtractor {
/*
* 解压缩命令
*/
private static int g_File_Number = 0 ;//写入磁盘时rar文件的编号
private static String unrarCmd = "C://WinRAR//unrar.exe ";

public static void main(String[] args) {
          RarExtractor rar = new RarExtractor();
          InputStream is = null;
         StringBuffer text = new StringBuffer();
         try {
              is = new FileInputStream( "c://test.rar ");
              int n = rar.getText(is, text);
              System.out.println(text);
           } catch (FileNotFoundException e) {
             e.printStackTrace();
           }
}

/**
*
* @param is
* @param text
* @return
*/
private int getText(InputStream is, StringBuffer text) {
      // 写入文件的临时文件名
       String fileName = "tempfile " +   g_File_Number+ ".rar ";
       // 写入临时文件的路径
       String fileDir = "c:// "+fileName;
         try {
               //向文件中写入数据
                FileOutputStream fos = new FileOutputStrea(fileDir);
                int n = 0;
               byte[] b = new byte[1024];
               while ((n = is.read(b)) > 0) {
                    fos.write(b, 0, n);
                 }
                fos.close();//文件写完后关闭流

                 //用unrar命令打印输出rar文件列表
                String vbCmd = unrarCmd + " vb "+fileDir;
                Runtime rt = Runtime.getRuntime();  
                 Process p = rt.exec(vbCmd);
                InputStream newis = p.getInputStream();
                String fileList = null;//保持rar文件中的文件名列表
                 while((n = newis.read(b))> 0) {
                       if(fileList == null)
                              fileList = new String(b,0,n);
                      else {
                           fileList += new String(b,0,n);
                      }
              }
                   String[] fileListArray= null;
                   if(fileList == null)return 0;
                  fileListArray = fileList.split( "/r/n ");//windows系统下以“/r/n分割”
                   String subFileName = null;
                  String subFileCmd = null;
                 for(int i= 0 ; i < fileListArray.length; i++) {
                         subFileName = fileListArray[i];//获得rar文件内部单个文件名
                         //p 打印输出文件内容
                         subFileCmd = unrarCmd + " p "+fileDir + " "+subFileName;
                          Process subp = rt.exec(subFileCmd);
                           subInpuStream = subp.getInputStream();
                        //这里根据列表文件名,判断文件的类型,
                         //根据文件类型,调用不同的文档解析程序解析
                      //如果文档为rar文件则递归调用该方法

                        getText(subInputStream,text);
                   }


              } catch (IOException e) {
                e.printStackTrace();
           }
        //删除临时文件
           deleteFile(fileDir);
        return 0;
}

/**删除临时文件
* fileDir为临时文件完全路径
*/
    private void deleteFile(String fileDir) {
         File file = new File(fileDir);
           file.delete();
     }
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值