java增量更新_文件比较 增量 更新 系统发布 增量更新

该博客介绍了一个使用Java编写的增量更新工具,用于找出线上系统和待发布系统间的文件差异,包括修改、新增和删除的文件。用户需提供两个工程路径,工具会生成差异文件列表并复制到指定目录。已解决文件时间戳变动问题,但仅在Windows上测试,适用于增量更新和系统发布。
摘要由CSDN通过智能技术生成

用于需找线上系统与准备发布的系统之间的文件差异,并生成差异文件列表。包括寻找有修改的文件,新增的文件和需要删除的文件。

使用步骤,

1 eclipse导入maven工厂;

2 打开IncrementalUpdatetools.java

3 更改类里面的常量LASTEST_FILE_PATH,改为你自己的指定的增量文件存放的目录,必须保证该目录是空的。

4 右键run as java application

5 在控制台输入需要比较的两个工程的项目路径,其中第一个输入的是正在线上运行的项目目录,第二个输入的是准备发布的项目目录

已知问题,

1 增量文件和文件夹的修改时间和创建时间会发生变动。(fixed)

备注,

未经详细测试(在windows文件系统进行过简单测试,linux未进行测试)

有问题,请反馈。谢谢

下载地址

package com.chase;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import java.util.regex.Pattern;

import org.apache.commons.io.FileUtils;

/**

*

* @author 404646846@qq.com

* @Version : V<1.0>

*/

public class IncrementalUpdateTools {

//增量后的文件存放地址,运行本程序前,请保证改目录为空目录

public static final String LASTEST_FILE_PATH = "/difference";

public static String originalPath;

public static String destinationPath;

public final static String WAR_FILE_NAME = "web";

//不参与对比的文件和文件夹

public final static String[] skippedFiles = { "([.]svn)","([.]bak)","([.]svn-base)", "(Thumbs[.]db)" };

/**

* 获取从控制台输入的目录路径

*

* @author 404646846@qq.com

* @param name

* 提示

* @return 返回目录

*/

public static File path2File(String name) {

System.out.println("请输入" + name + "的目录:");

byte[] b = new byte[1024];

int n;

File f = null;

String pathStr;

try {

while (null == f || !f.exists()) {

n = System.in.read(b);

pathStr = new String(b, 0, n - 2);

f = new File(pathStr);

if (f.exists()) {

break;

} else {

System.out.println(name + "的目录不存在!请重新输入:");

}

}

} catch (IOException e) {

e.printStackTrace();

}

return f;

}

public static boolean regexMatch(String regex, String name) {

Pattern p;

p = Pattern.compile(regex);

return p.matcher(name).find();

}

/**

* 获取文件MD5值

*

* @author 404646846@qq.com

* @param ff

* 目录

* @param pathStr

* 目录的路径

* @return

*/

public static Map allFiles(File ff, String pathStr) {

Map map = new HashMap();

File[] files = ff.listFiles();

String filePath, fileMD5;

StringBuffer sb = new StringBuffer();

boolean flag = false;;

FileInputStream fis;

try {

for (File f : files) {

for (String s : skippedFiles) {

if (regexMatch(s, f.getName())) {

sb.append(s + " match ----> "

+ f.getName() + " \n");

flag = true;

break;

}

}

if (flag){

flag = false;

continue;

}

if (f.isFile()) {

filePath = f.getAbsolutePath();

fis = new FileInputStream(f);

fileMD5 = org.apache.commons.codec.digest.DigestUtils

.md5Hex(fis);

System.out.println(filePath);

map.put(filePath.replace(pathStr, ""), fileMD5);

} else {

map.putAll(allFiles(f, pathStr));

}

}

if(null != sb && !"".equals(sb.toString())){

System.out.println("跳过了文件,");

System.out.println(sb.toString());

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return map;

}

/**

* 对比两个map,返回是否存在新增,修改或者删除的文件

*

* @author 404646846@qq.com

* @param oMap

* 源目录

* @param dMap

* 修改后的目录

* @return

*/

public static List> mapComparison(Map oMap,

Map dMap) {

Entry dEntry;

List amendedList = new ArrayList(), diffList = new ArrayList();

List> list = new ArrayList>();

int counter = 0;

Iterator> it = dMap.entrySet().iterator();

while (it.hasNext()) {

dEntry = it.next();

if (oMap.containsKey(dEntry.getKey())) {// 如果存在这个文件

if (oMap.get(dEntry.getKey()).equals(dEntry.getValue())) {// 如果文件相同

} else {

amendedList.add(dEntry.getKey());

}

} else {// 文件不存在

diffList.add(dEntry.getKey());

}

counter++;

}

list.add(amendedList);

list.add(diffList);

return list;

}

/**

* 复制文件

*

* @author 404646846@qq.com

* @param srcFile

* 源文件

* @param destFile

* 目标地址

*/

public static boolean copyFile(File srcFile, File destFile) {

boolean f = false;

try {

// System.out.println("准备将 " + srcFile.getAbsolutePath() + " 移动至 "

// + destFile.getAbsolutePath() + " ");

if (destFile.exists()) {

throw new Exception("文件已经存在!文件移动失败!");

}

if (!destFile.getParentFile().exists()) {

// System.out.println("正在创建:" + destFile.getParent());

if (!destFile.getParentFile().mkdirs()) {

throw new Exception("创建文件夹失败!");

} else {

// System.out.println("成功创建文件夹!");

}

}

destFile.setLastModified(srcFile.lastModified());

// FileInputStream fis = new FileInputStream(srcFile);

// FileOutputStream fos = new FileOutputStream(distFile);

// FileChannel fic = fis.getChannel();

// FileChannel foc = fos.getChannel();

// foc.transferFrom(fic, 0, fic.size());

// fic.close();

// foc.close();

// fis.close();

// fos.close();

FileUtils.copyFile(srcFile, destFile, true);

f = true;

// System.out.println("成功将 " + srcFile.getAbsolutePath() + " 移动至 "

// + destFile.getAbsolutePath() + " ");

} catch (FileNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return f;

}

public static void main(String[] args) {

String originalPathStr, destPathStr;

Map oMap, dMap;

List> list;

List amendList, diffList;

File ff = path2File("现有系统的文件");

originalPathStr = ff.getAbsolutePath();

oMap = allFiles(ff, originalPathStr);

ff = path2File("修改后的系统文件");

destPathStr = ff.getAbsolutePath();

dMap = allFiles(ff, destPathStr);

System.out.println("开始寻找有修改和新增的文件!");

list = mapComparison(oMap, dMap);

System.out.println("结束寻找有修改和新增的文件!");

amendList = list.get(0);// 有改动的文件

diffList = list.get(1);// 新增的文件

System.out.println("开始复制差异文件!");

for (String amendFile : amendList) {

copyFile(new File(destPathStr + File.separator + amendFile),

new File(LASTEST_FILE_PATH + File.separator + amendFile));

}

for (String diffFile : diffList) {

copyFile(new File(destPathStr + File.separator + diffFile),

new File(LASTEST_FILE_PATH + File.separator + diffFile));

}

System.out.println("差异文件复制结束!");

System.out.println("开始寻找需要删除的文件!");

list = mapComparison(dMap, oMap);

System.out.println("结束寻找需要删除的文件!");

amendList = list.get(0);// 有改动的文件

System.out.println("有" + amendList.size() + "个文件需要更新:");

for (String diffFile : amendList) {

System.out.println(originalPathStr + File.separator + diffFile);

}

diffList = list.get(1);// 删除的文件

System.out.println("有" + diffList.size() + "个文件需要从原始目录删除:");

for (String diffFile : diffList) {

System.out.println(originalPathStr + File.separator + diffFile);

}

System.out.println("获取增量文件结束!");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值