JAVA中比较两个文件夹不同的方法,可以通过两步来完成,首先遍历获取到文件夹下的所有文件夹和文件,再通过文件路径和文件的MD5值来判断文件的异同。具体例子如下:

 public class TestFolderCompare {

     /**
* 根据路径获取所有的文件夹和文件,及文件的md5值
* @param path 路径
*/
private static Map<String, FileModel> getFiles(String path) throws IOException {
Map<String, FileModel> map = new HashMap<String, FileModel>();
File folder = new File(path);
Object[] files = getFileList(folder).toArray();
Arrays.sort(files);
for (Object obj : files) {
File file = (File) obj;
// 去掉根目录,正则的\\\\,转义为java的\\,再转义为\
String key = file.getAbsolutePath().replaceAll("\\\\", "/").replaceAll(path, "");
String md5 = "";// 文件夹不比较md5值
if (file.isFile()) {
md5 = DigestUtils.md5Hex(new FileInputStream(file));
}
FileModel fileModel = new FileModel(file, md5);
map.put(key, fileModel);
}
return map;
} /**
* 递归获取路径下所有文件夹和文件
* @param folder 文件路径
*/
private static List<File> getFileList(File folder) {
List<File> list = new ArrayList<File>();
File[] files = folder.listFiles();
for (File file : files) {
list.add(file);
if (file.isDirectory()) {
List<File> fileList = getFileList(file);
list.addAll(fileList);
}
}
return list;
} /**
* 比较两个文件集合的不同
* @param fileMap1 文件集合
* @param fileMap2 文件集合
*/
public static List<FileModel> compareFile(Map<String, FileModel> fileMap1, Map<String, FileModel> fileMap2) {
List<FileModel> list = new ArrayList<FileModel>();
for (String key : fileMap1.keySet()) {
FileModel fileModel1 = fileMap1.get(key);
FileModel fileModel2 = fileMap2.get(key);
// 将fileMap2中没有的文件夹和文件,添加到结果集中
if (fileModel2 == null) {
list.add(fileModel1);
continue;
}
// 文件的md5值不同则add到比较结果集中
if (fileModel1.getFile().isFile() && !fileModel1.getMd5().equals(fileModel2.getMd5())) {
list.add(fileModel1);
}
}
return list;
} public static void main(String[] args) throws IOException {
String path1 = "c:/a1";
String path2 = "c:/a2";
// 获取路径下所有文件夹和文件,及文件的md5值
Map<String, FileModel> fileMap1 = getFiles(path1);
Map<String, FileModel> fileMap2 = getFiles(path2);
List<FileModel> resultList = new ArrayList<FileModel>();
// 得到fileMap2中没有的文件夹和文件,及md5值不同的文件
resultList.addAll(compareFile(fileMap1, fileMap2));
// 得到fileMap1中没有的文件夹和文件,及md5值不同的文件
resultList.addAll(compareFile(fileMap2, fileMap1));
// 输出最终结果
for (FileModel fileModel : resultList) {
System.out.println(fileModel.getFile().getAbsolutePath() + " " + fileModel.getMd5());
}
}
}

用到的文件model

 public class FileModel {
public File file;
public String md5; public FileModel(File file, String md5) {
this.file = file;
this.md5 = md5;
}
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getMd5() {
return md5;
}
public void setMd5(String md5) {
this.md5 = md5;
}
}

JAVA中比较两个文件夹不同的方法的更多相关文章

  1. Windows文件路径转换为java中可识别的文件路径的转义方法,(另附转义多种格式)

    ps:欢迎加qq好友:2318645572,交流学习 一:路径转化 Windows中的文件路径格式为 D:\eclipse\apache-tomcat-7.0.67\wtpwebapps\... Ja ...

  2. java获取web项目下文件夹的路径方法

    方法一: String realPath=request.getSession().getServletContext() .getRealPath("upload"); 方法二: ...

  3. JAVA 中加载属性文件的4种方法

    小总结 : 这个集合属性可以反序列化, 把持久化数据读出来, 输入流中放入要操作的文件! p.load加载这个输入流! p.getProperty( key) 根据这个键获得值! 补充 : web工程 ...

  4. Path,Files巩固,题目:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中

    这个题目用传统的File,InputStream可以做,但是如果用Files,Path类做,虽然思路上会困难一些,但是代码简洁了很多,以下是代码: import java.io.IOException ...

  5. 在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM

    题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...

  6. java基础 File 递归删除文件夹中所有文件文件夹 目录(包含子目录)下的.java文件复制到e:/abc文件夹中, 并统计java文件的个数

    File 递归删除文件夹中所有文件文件夹 package com.swift.kuozhan; import java.io.File; import java.util.Scanner; /*键盘录 ...

  7. 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同

    在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...

  8. java中调用kettle转换文件

    java中调用kettle转换文件 通过命令行也能够调用,然后java中调用命令行代码也能够.这样没有和java代码逻辑无缝集成.本文说明kettle5.1中假设通过其它API和java代码无缝集成: ...

  9. Unity中所有特殊的文件夹

    1. 隐藏文件夹以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.2. Standard Assets在这个文件夹中的脚本最先被编译 ...

随机推荐

  1. iOS中 学会如何对sqlite3 进行封装 (纯手工)

    #waring ---(看官注意) ---使用说明: ①在创建自定义model类之前让该类继承自文件中的Model类, ②为model类选一个NSString属性作为主键:(既,在初始化方法里面将从父 ...

  2. 加速scp传输速度

    当需要在机器之间传输400GB文件的时候,你就会非常在意传输的速度了.默认情况下(约125MB带宽,网络延迟17ms,Intel E5-2430,本文后续讨论默认是指该环境),scp的速度约为40MB ...

  3. mybatis动态sql排序无效

    order by 字段,在用动态sql时会出现问题,排序无效,而且在日志里查询不到,不能发现这个错误. 通常,咱们的动态sql一般都会用#代替$,因为#可以防止sql注入问题. 但是在order by ...

  4. Zabbix实战-简易教程系列

    一.基础篇(安装和接入) Zabbix实战-简易教程--总流程  Zabbix实战-简易教程--整体架构图 Zabbix实战-简易教程--DB安装和表分区 Zabbix实战-简易教程--Server端 ...

  5. wifi入侵思路

    一.得到wifi密码   系统:Kali Linux   工具:Aircrack-ng,EWSA   方法:   1.WEP加密:deauth攻击:得到足够报文直接破解.   2.WPA加密:deau ...

  6. qscoj 128 喵哈哈村的魔法源泉(2)(模仿快速幂,好题)

    喵哈哈村的魔法源泉(2) 发布时间: 2017年5月9日 20:59   最后更新: 2017年5月9日 21:00   时间限制: 1000ms   内存限制: 128M 描述 喵哈哈村有一个魔法源 ...

  7. HDU1061-Rightmost Digit-规律题,快速幂

    Rightmost Digit Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. HDU--2015

    偶数求和 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  9. linux基本命令学习02

    =============================================================================a.txtc:\abc\a.txt windo ...

  10. solr6.5的安装与配置

    环境介绍 solr 6.5 tomcat8 jdk1.8 win7系统 一.下载solr安装包 下载地址:http://www.apache.org/dyn/closer.lua/lucene/sol ...