在百度上找的一段解压缩rar文件的代码,如何判断压缩包已经解压完成呢?
    解压完成后我还须要执行另外一些代码,比如我要获得解压出来的文件的文件名,调用这个方法后直接调用获得文件名的方法是获得不了的,因为压缩包中的文件还没解压出来当然就获得不了了。
    如何才能在解压完成后,在执行其他方法呢? /**  
  * 将1个RAR文件解压  
  * rarFileName 需要解压的RAR文件(必须包含路径信息以及后缀)  
  * destDir 解压后的文件放置目录  
  */  
  public static void unRARFile(String rarFileName, String destDir) {   
  if (!rarFileName.toLowerCase().endsWith(".rar")) {
              System.out.println("非rar文件!");
              return;
          }
  unrarCmd +=" "+ rarFileName + " " + destDir;   
  try {   
  Runtime rt = Runtime.getRuntime();   
  Process p = rt.exec(unrarCmd);
   } catch (Exception e) {   
  System.out.println("e.getMessage()="+e.getMessage());   
  }   
  }  

解决方案 »

  1.   

    补充一下解压缩的代码
    private static String unrarCmd = "C:\\Program Files\\WinRAR\\unrar.exe x "; 
      

  2.   

    你的方法调用结束了,就是完成了。如果没有压缩完成,程序会一直组塞在这个方法上的:unRARFile
      

  3.   

    给unRARFile()方法加个返回值, 懂?
      

  4.   

    这个解压缩的方法 我理解的是 调用的doc命令,用命令执行解压,调用这个命令后,一边解压,程序一边往下走。所以在解压的过程中程序是不会停止的,所以我如果是调用完解压的方法后直接去获得解压出来的文件的文件名,如果压缩包有点大的话是获得不了或者获得不完的,因为他还没有解压完。
      

  5.   

    不会吧,我在调用解压缩方法的后面加了这段代码
    for(int i=0;i<1000000;i++){
            String s="1";
    s+="1";
    }
    解压一个比较小的rar包,可以获得解压出来的文件名,不加的话获得不了,楼上说的加返回值的方法也试了,不行,所以我确定 我在6楼说的应该是对的
      

  6.   

    Process对象有个waitFor方法. 会使你当前进程暂停.
    p.waitFor();
    但是刚才在本机上用rar.exe测试的时候一直不停止了. 你可以在你的代码中加入p.waitFor()然后看看.
      

  7.   

    刚才看了下, 是我的命令行不对. 有个解压路径没有设置正确.
    设置正确以后就好了. p.waitFor()会在解压完成后有个返回值. 这个返回值和p.exitValue()相同.
    成功结束为0
      

  8.   

    更新一下. 实际上除了调用p.waitFor()方法以外, 还可以通过获取Process的InputStream来等待执行解压缩执行结束.    /**
         * 根据winrar的文档推荐使用rar.exe, 另外加入参数-y在你需要选择的时候自动输入y
         * 否则代码中要加入当winrar询问时的处理, 不然你的主进程将会被柱塞.
         */
        private static String unrarCmd = "C:\\Program Files\\WinRAR\\rar.exe x -y";
        /**  
         * 将1个RAR文件解压  
         * rarFileName 需要解压的RAR文件(必须包含路径信息以及后缀)  
         * destDir 解压后的文件放置目录  
         */  
        public static void unRARFile(String rarFileName, String destDir) {   
            if (!rarFileName.toLowerCase().endsWith(".rar")) {
                System.out.println("非rar文件!");
                return;
            }
            unrarCmd +=" "+ rarFileName + " " + destDir;
            Runtime rt = null;
            Process p = null;
            int result;
            try {   
                rt = Runtime.getRuntime();   
                p = rt.exec(unrarCmd);
                result = p.waitFor(); // 这一句将使你的当前主进程等待执行结束后才会继续执行后面代码.
                /**
                 * 或者使用如下代码代替上面result = p.waitFor();
                 * InputStream in = null;
                 * InputStreamReader ir = null;
                 * BufferedReader reader = null;
                 * try {
                 *     in = p.getInputStream();
                 *     ir = new InputStreamReader(in, "gbk");
                 *     //一般默认中文windows操作系统都是gbk字符集, 请根据你自己系统进行更改.
                 *     reader = new BufferedReader(ir);
                 *     String inStr = null;
                 *     while ( (inStr = reader.readLine()) != null ) {
                 *         System.out.println(inStr);
                 *     }
                 *      result = p.exitValue();
                 * } catch(Exception e) {
                 *     e.printStackTrace();
                 * } finally {
                 *    // 关闭之前的输入流什么的代码
                 * }
                */
                if ( result != 0 ) {
                   System.out.println("解压失败");
                }
            } catch (Exception e) {   
                System.out.println("e.getMessage()="+e.getMessage());   
            }
          }  
      

  9.   

    http://topic.csdn.net/u/20090216/23/f4df4a38-c72f-492e-997e-794c46b1c39e.html
    这里有,
    接分