JAVA中比较两个文件夹不同的方法
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中比较两个文件夹不同的方法的更多相关文章
- Windows文件路径转换为java中可识别的文件路径的转义方法,(另附转义多种格式)
ps:欢迎加qq好友:2318645572,交流学习 一:路径转化 Windows中的文件路径格式为 D:\eclipse\apache-tomcat-7.0.67\wtpwebapps\... Ja ...
- java获取web项目下文件夹的路径方法
方法一: String realPath=request.getSession().getServletContext() .getRealPath("upload"); 方法二: ...
- JAVA 中加载属性文件的4种方法
小总结 : 这个集合属性可以反序列化, 把持久化数据读出来, 输入流中放入要操作的文件! p.load加载这个输入流! p.getProperty( key) 根据这个键获得值! 补充 : web工程 ...
- Path,Files巩固,题目:从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中
这个题目用传统的File,InputStream可以做,但是如果用Files,Path类做,虽然思路上会困难一些,但是代码简洁了很多,以下是代码: import java.io.IOException ...
- 在存放源程序的文件夹中建立一个子文件夹 myPackage。例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage)。在 myPackage 包中创建一个YMD类,该类具有计算今年的年份、可以输出一个带有年月日的字符串的功能。设计程序SY31.java,给定某人姓名和出生日期,计算该人年龄,并输出该人姓名、年龄、出生日期。程序使用YM
题目补充: 在存放源程序的文件夹中建立一个子文件夹 myPackage.例如,在“D:\java”文件夹之中创建一个与包同名的子文件夹 myPackage(D:\java\myPackage).在 m ...
- java基础 File 递归删除文件夹中所有文件文件夹 目录(包含子目录)下的.java文件复制到e:/abc文件夹中, 并统计java文件的个数
File 递归删除文件夹中所有文件文件夹 package com.swift.kuozhan; import java.io.File; import java.util.Scanner; /*键盘录 ...
- 【转载】C#代码开发过程中如何快速比较两个文件夹中的文件的异同
在日常的使用电脑的过程中,有时候我们需要比较两个文件夹,查找出两个文件夹中不同的文件以及文件中不同的内容信息,进行内容的校对以及合并等操作.其实使用Beyond Compare软件即可轻松比较,Bey ...
- java中调用kettle转换文件
java中调用kettle转换文件 通过命令行也能够调用,然后java中调用命令行代码也能够.这样没有和java代码逻辑无缝集成.本文说明kettle5.1中假设通过其它API和java代码无缝集成: ...
- Unity中所有特殊的文件夹
1. 隐藏文件夹以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.2. Standard Assets在这个文件夹中的脚本最先被编译 ...
随机推荐
- 为 MariaDB 配置远程访问权限
最近在配置MySQL远程连接的时候发现我的MySQL数据库采用的是 MariaDB 引擎,与普通的数据库配置有点不同 经过查找资料终于完成了,特此记录方便以后查询 MariaDB 与普通的MySQL数 ...
- 利用树莓派实现监控系统二(用motion实现监控)
终于要开始实现监控啦!ಠ౪ಠ 看起来很简单的步骤,但是过程却无比艰辛,踩坑是最好的成长 (/= _ =)/~┴┴ 第一步,不是安装!而是 update!ㄟ( ▔, ▔ )ㄏ sudo apt-get ...
- IntelliJ IDEA 使用技巧
本着工欲善其事必先利其器的精神,闷头写代码之外花点时间研究一下自己用的 IDE,其带来的效率提升非常可观. 高效定位代码 无处不在的跳转 项目之间跳转 下一个 ctrl + alt + ] 上一个 c ...
- 微信小程序——Now you can provide attr "wx:key" for a "wx:for" to improve performance.
在官方的swiper(滑块视图容器)中demo代码,运行时会出现Now you can provide attr "wx:key" for a "wx:for" ...
- 异常笔记--java编程思想
开一个新的系列,主要记一些琐碎的重要的知识点,把书读薄才是目的...特点: 代码少,概念多... 1. 基本概念 异常是在当前环境下无法获得必要的信息来解决这个问题,所以就需要从当前环境跳出,就是抛出 ...
- python通过getopt模块获取执行命令参数
python脚本和shell脚本一样可以获取命令行的参数,根据不同的参数,执行不同的逻辑处理. 通常我们可以通过getopt模块获得不同的执行命令和参数. 下面我通过新建一个test.py的脚本解释下 ...
- 任务调度框架Quartz原理简介
[TOC] 第一章 Quartz 1.1 Quartz概念 Quartz是OpenSymphony开源组织的一个Java开源项目, 在2009被Terracotta收购.Quartz官网 1.2 Qu ...
- HDU 2504 又见GCD(最大公约数与最小公倍数变形题)
又见GCD Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- POJ3264-Balanced Lineup-线段树
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 53721 Accepted: 25244 ...
- c++(链表逆转)
链表逆转是面试环境中经常遇到的一道题目,也是我们在实际开发中可能会遇到的开发需求.和线性逆转不一样,单向链表的节点需要一个一个进行处理.为了显示两者之间的区别,我们分别对线性内存和链表进行逆转: (1 ...