对比两个压缩包内文件,将不同的文件及文件夹单独移到一个新文件夹里

项目需要,要对比两个apk,看是否有新增文件,并列出。

个人写这个写了有段时间,如果不跟业务结合的话可能就不会写这么久了(感慨下,还是单纯的逻辑代码简单啊!)

上代码

private String testFile(String path1,String unzipPath1,String path2,String unzipPath2,String newUnzipPath) throws Exception{
    long l = System.currentTimeMillis();
    //将压缩包分别解压
    ZipUtils.unZip(path1, unzipPath1);
    ZipUtils.unZip(path2, unzipPath2);
    File f1 = new File(unzipPath1);
    File f2 = new File(unzipPath2);
    File newF=new File(newUnzipPath);
    newF.mkdirs();
    //获取解压后路径下的全部文件及文件夹
    Set<String> fileList1 = getAllFile(f1, unzipPath1);
    Set<String> fileList2 = getAllFile(f2, unzipPath2);
    Set<String> newfilelist = new HashSet<>();
    for (String p : fileList2) {
      if (fileList1.add(p)) {
        newfilelist.add(p);
      }
    }
    //不同文件及文件夹复制
    for (String p : newfilelist) {
      String oldp=unzipPath2+p;
      p = newUnzipPath + p;
      File file = new File(p);
      file.getParentFile().mkdirs();
      file.createNewFile();
      FileUtils.copyFile(new File(oldp),file);
    }
    long l2 = System.currentTimeMillis();
    System.out.println("文件对比耗时(秒):"+(l2 - l) / 1000);
    if (newfilelist.size() > 0) {
      return newUnzipPath;
    } else {
      return null;
    }
  }

  private static Set<String> getAllFile(File f,String rootPath){
    Set<String> filseList=new HashSet<>();
    File[] files=f.listFiles();
    for(int i=0;i<files.length;i++){
      File ff=files[i];
      if(ff.isDirectory()){
        filseList.addAll(getAllFile(ff,rootPath));
      }else{
        filseList.add(ff.getAbsolutePath().replace(rootPath,""));
      }
    }
    return filseList;
  }

path1:压缩包1所在路径

unzipPath1:压缩包1要解压到的路径

paht2:压缩包2所在路径

unzipPath2:压缩包2要解压到的路径

newzipPath:不同文件及文件夹存放路径

该方法对比的是压缩包2相对于压缩包1不同的文件,在我的项目中主要是用来对比新版本的apk相对于旧版本的apk有什么新增的文件。(当时在网上找了找,发现并没有现成的轮子可以用,所以我就把我造好的轮子发出来供大家使用,批判。水平有限,有可以优化改进的地方,欢迎大家畅所欲言)

注:unzipPath1和unzipPath2路径不要相同,不然比较不了,因为比较的时候是通过这两个路径去生成file类,两个路径相同的话,对比没有效果。

posted @ 2019-05-30 09:52  白龙守  阅读(941)  评论(2编辑  收藏  举报