最近做一个项目,要求解析rar文档
语言为java
系统为linux
开发工具为eclipse接口为
public int getText(InputStream is ,StringBuffer text)
int 为返回rar文件是否加密。
is为rar文件输入流。
text为解析rar文档内的全部文档内容。
现在我遇到的问题是怎么用rar的命令,和这里传进来的流一起,解析rar文件
我用直接传rar文件的路径和名字是很好做的,关键是现在要以流的形式传进来。
我就不知道怎么做了。
请大家帮帮哦。
本人不甚感激。

解决方案 »

  1.   

    RAR 是有专利的,压缩算法是商业机密
      

  2.   

    WinRAR 使用是需要付费的,并不是免费使用的。由于 RAR 的专利性,没有专门的开源框架来解析 RAR 文档。
      

  3.   

    可以用unrar的命令啊
    只是这里是要求传入流。
    我能用传入人rar文件的路径加文件名
    能解决
    主要是接口定义的是流,我写过将流在还原为rar文件,这样也行
    只不过这样效率太低。
    我想有没有办法直接用流和unrar命令一起用。而不将流转化为rar文件再来解析。
      

  4.   

    哦,还以为你自己要写解析算法呢 原来是用RAR自带的命令啊
      

  5.   

    http://sourceforge.net/projects/java-unrar/
      

  6.   

    用RAR自带的命令啊。
    WinRAR 使用是需要付费的,并不是免费使用的。由于 RAR 的专利性,没有专门的开源框架来解析 RAR 文档。
      

  7.   

    这里给出我的解决这个的程序
    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 {
    /*
     * 解压缩命令
     */
    java.util.Random run = new java.util.Random(10); 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" + run.nextInt()+".rar";
    // 写入临时文件的路径
    String fileDir = "c:\\"+fileName;
    try {
    //向文件中写入数据
    FileOutputStream fos = new FileOutputStream(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);
    newis = subp.getInputStream();
    //这里根据列表文件名,判断文件的类型,
    //根据文件类型,调用不同的文档解析程序解析
    //如果文档为rar文件则递归调用该方法
    }


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