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. View 动画 Animation 运行原理解析

    这次想来梳理一下 View 动画也就是补间动画(ScaleAnimation, AlphaAnimation, TranslationAnimation...)这些动画运行的流程解析.内容并不会去分析 ...

  2. JBDC工具类

    package Util; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultS ...

  3. 使用mysql乐观锁解决并发问题

    案例说明: 银行两操作员同时操作同一账户.比如A.B操作员同时读取一余额为1000元的账户,A操作员为该账户增加100元,B操作员同时为该账户扣除50元,A先提交,B后提交.最后实际账户余额为1000 ...

  4. Rosenblatt感知器

    一.定义 Rosenblatt感知器建立在一个线性神经元之上,神经元模型的求和节点计算作用于突触输入的线性组合,同时结合外部作用的偏置,对若干个突触的输入项求和后进行调节. 二.基本计算过程 Rose ...

  5. zoj 3494:BCD Code

    Description Binary-coded decimal (BCD) is an encoding for decimal numbers in which each digit is rep ...

  6. Big Event in HDU(多重背包套用模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1171 Big Event in HDU Time Limit: 10000/5000 MS (Java/Othe ...

  7. Monthly update for Dynamics 365 for Operation

    日期 标题, 类别 版本 描述 2017/8/22 Dyn 365 Fin and Ops, Ent ed July 2017 Plat Update 10 Category: Download   ...

  8. docfx(二)

    1. 初始化一个docfx项目 1.创建一个文件夹D:\docfx_walkthrough 2.运行cmd 到该文件下执行命令D:\docfx_walkthrough 3.输入命令 docfx ini ...

  9. 使用npm install报错-4048 operation not permitted解决

    刚刚使用npm install时一直报错-4048 operation not permitted,也尝试了多种方法,终于使问题得到解决,这里总结几种方法,先贴图: 一:权限问题 首先看到operat ...

  10. kafka producer生产数据到kafka异常:Got error produce response with correlation id 16 on topic-partition...Error: NETWORK_EXCEPTION

      kafka producer生产数据到kafka异常:Got error produce response with correlation id 16 on topic-partition... ...