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. 深入学习Java8 Lambda (default method, lambda, function reference, java.util.function 包)

    Java 8 Lambda .MethodReference.function包 多年前,学校讲述C#时,就已经知道有Lambda,也惊喜于它的方便,将函数式编程方式和面向对象式编程基于一身.此外在使 ...

  2. 异常笔记--java编程思想

    开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出 ...

  3. 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】

    FFF at Valentine Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  4. POJ 3264 Balanced Lineup【线段树区间查询求最大值和最小值】

    Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 53703   Accepted: 25237 ...

  5. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9894  Solved: 4561[Subm ...

  6. Xshell无法连接到LINUX虚拟机

    首先与遇到的情况是,在虚拟机下安装了Linux后,xshell无法连接远程的虚拟机. 我遇到的情况是虚拟机可以ping 主机,主机确ping不了虚拟机. 使用的VM设置了两个网卡,一个nat  一个h ...

  7. 找出单链表中倒数第K个元素

  8. powerdesign

  9. Centos7网络配置-转载

    一. 查看网络地址: centos7取消了ifconfig命令,使用ip addr命令查看IP地址 二.配置网络 用VirtualBox安装的CentOS7,安装完成后,发现无法上网,于是到网上查了一 ...

  10. CSS鼠标样式 cursor 属性

    值 描述 url 需使用的自定义光标的 URL. 注释:请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标. default 默认光标(通常是一个箭头) auto 默认.浏览器 ...