对于当前java 文件比较 diffutils-1.2.1.jar 的使用和修改

我们项目需要做文件比较处理,从网上下载了diffutils-1.2.1.jar,总的来说该文件比较还算正确,但有不足的地方,新的文件和原来的文件若有不同,不能反应是inset和delete,返回的类型全部都是change,我对它进进了封装,并测试了大量的文件,都还不错,具体的修改后的代码如下:

public class CompareListUtils {
	public static final String Result_EQUAL = "EQUAL";
	public static final String Result_INSERT = "INSERT";
	public static final String Result_DELETE = "DELETE";
	public static final String Result_CHANGE = "CHANGE";
	/***
	 * 
	 * @param filename
	 * @return
	 */
	private static List<String> fileToLines(String filename) {
		List<String> lines = new LinkedList<String>();
		String line = "";
		try {
			BufferedReader in = new BufferedReader(new FileReader(filename));
			while ((line = in.readLine()) != null) {
				lines.add(line);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return lines;
	}
	
	/***
	 * 对文件进行比较
	 * INSERT, DELETE, CHANGE, EQUAL
	 * @param fromFileName 原来的文件名
	 * @param toFileName 新的文件名
	 */
	public static List<CompareMo> compareAll(String fromFileName, String toFileName) {
		List<String> original = fileToLines(fromFileName);
		List<String> revised = fileToLines(toFileName);
		final DiffRowGenerator.Builder builder = new DiffRowGenerator.Builder();
		final DiffRowGenerator dfg = builder.build();
		final List<DiffRow> rows = dfg.generateDiffRows(original, revised);
		List<CompareMo> listCompareMo = new ArrayList<CompareMo>();
		int i=1;
		int oldSize = original.size();
		int newSize = revised.size();
		int insertSize = 0;
		int deleteSize = 0;
		for (final DiffRow diffRow : rows) {
			String tag = diffRow.getTag().toString();
			String oldLine = diffRow.getOldLine();
			String newLine = diffRow.getNewLine();
			if(Result_CHANGE.equals(tag)){
				boolean isInset = false;
				if ((i-insertSize) <= oldSize) {
					if(oldLine!=null&& oldLine.trim().length()==0){
						if(!original.get(i-1-insertSize).equals(oldLine)){
							tag = Result_INSERT;
							isInset = true;
							insertSize ++;
						}
					}
				}
				if (!isInset) {
					if ((i-deleteSize) <= newSize) {
						if(newLine!=null&& newLine.trim().length()==0){
							if(!revised.get(i-1-deleteSize).equals(oldLine)){
								tag = Result_DELETE;
								isInset = true;
								deleteSize ++;
							}
						}
					}
				}
			}
			listCompareMo.add(new CompareMo(
					i, oldLine, 
					newLine, 
					tag
			));
			i++;
		}
		return listCompareMo;
	}
	
	public static void main(String[] args) {
		List<CompareMo> compares = CompareListUtils.compareAll(
				"D:/work/WiFiPages/originalFile.txt",
				"D:/work/WiFiPages/newFile.txt");
		for (CompareMo compare : compares) {
			System.out.println(compare.getId() + " 结果 :" + compare.getType()
					+ ":" + compare.getOldText() + "<>" + compare.getNewText());
		}
	}
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值