Java实现对某一文件夹下的所有txt文件进行两两对比并展示差异

本文档提供了一个Java程序,用于读取指定文件夹下的所有txt文件,并进行两两比较,显示不同之处。示例中创建了4个txt文件,其中1.txt和2.txt内容相同。代码通过读取文件内容,使用Hutool库进行处理,逐行对比文件差异,输出结果。运行截图展示了文件内容的比较情况。

你好呀,我是小邹。

今天卷一个Java基础知识:实现对某一文件夹下的所有txt文件两两对比并分别展示差异

准备数据

在d盘新建4个txt文件,2个sql文件(测试用,不会进行对比)

在这里插入图片描述

其中1.txt和2.txt完全相同

代码实现

package top.hqxiaozou;

import cn.hutool.core.collection.CollUtil;

import java.io.File;
import java.io.FileInputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * @author: 邹祥发
 * @date: 2022/8/3 13:22
 */
public class DiffTxts {
    public static void main(String[] args) throws Exception {
        List<String> fileNames = getFileName();
        if (CollUtil.isNotEmpty(fileNames)) {
            for (int j = 0; j < Objects.requireNonNull(fileNames).size(); j += 2) {
                //每次取两个txt文件进行对比
                File fileOld = new File(fileNames.get(j));
                File fileNew = new File(fileNames.get(j + 1));
                FileInputStream inputStream1 = new FileInputStream(fileOld);
                int size1 = inputStream1.available();
                byte[] buffer1 = new byte[size1];
                inputStream1.read(buffer1);
                inputStream1.close();
                String fileOldStr = new String(buffer1, StandardCharsets.UTF_8);
                FileInputStream inputStream2 = new FileInputStream(fileNew);
                int size2 = inputStream2.available();
                byte[] buffer2 = new byte[size2];
                inputStream2.read(buffer2);
                inputStream2.close();
                String fileNewStr = new String(buffer2, StandardCharsets.UTF_8);
                if (fileNewStr.equals(fileOldStr)) {
                    System.out.println("第" + (j + 1) + "个文件和第" + (j + 2) + "个文件完全相同!");
                    System.out.println();
                }
                String[] oldSplit = fileOldStr.split("\n");
                String[] newSplit = fileNewStr.split("\n");
                //旧文件
                if (!fileNewStr.equals(fileOldStr)) {
                    System.out.println("================第" + (j + 1) + "个文件===================");
                }
                for (int i = 0; i < oldSplit.length; i++) {
                    if (!oldSplit[i].equals(newSplit[i])) {
                        System.out.println("第" + (i + 1) + "行:" + oldSplit[i]);
                    }
                }
                //新文件
                if (!fileNewStr.equals(fileOldStr)) {
                    System.out.println("================第" + (j + 2) + "个文件===================");
                }
                for (int i = 0; i < newSplit.length; i++) {
                    if (i < oldSplit.length) {
                        if (!newSplit[i].equals(oldSplit[i])) {
                            System.out.println("第" + (i + 1) + "行:" + newSplit[i]);
                        }
                    } else {
                        System.out.println("第" + (i + 1) + "行:" + newSplit[i]);
                    }
                }
            }
        } else {
            System.out.println("文件夹为空!");
        }
    }

    public static List<String> getFileName() {
        // 文件夹路径
        String path = "D:/txt";
        File f = new File(path);
        if (!f.exists()) {
            //目录不存在就输出
            System.out.println(path + " not exists");
            return Collections.emptyList();
        }
        File[] fa = f.listFiles();
        ArrayList<String> fileList = new ArrayList<>();
        for (File fs : fa) {
            if (fs.isDirectory()) {
                // 目标文件为文件夹时
                System.out.println(path + fs.getName() + " [目录]");
            } else {
                String[] split = fs.getName().split("\\.");
                if (split[1].equals("txt")) {
                    //只添加.txt结尾的文件
                    fileList.add(path + "/" + fs.getName());
                }
            }
        }
        return fileList;
    }
}

运行效果图

在这里插入图片描述

### 拼接多个 GDS Cell 的方法 在 GDSII 文件处理中,将多个 `cell` 按照特定图层对齐进行两两肩拼接,是版图设计中常见的操作,尤其在布局复用、模块化设计和物理验证中具有重要意义。该过程主要包括: - 提取指定图层的边界框; - 根据边界框的左下角或右上角坐标进行对齐; - 按照不同方向(水平或垂直)进行拼接; - 生成新的包含拼接结构的 GDS 文件。 以下是个基于 `gdspy` 的 Python 实现方案,用于实现基于指定图层对齐进行两两拼接的功能。 #### 提取指定图层的边界框 ```python def get_layer_bbox(cell, layer): bbox = None for element in cell.elements: if getattr(element, 'layer', None) == layer: elem_bbox = element.get_bounding_box() if elem_bbox is not None: if bbox is None: bbox = elem_bbox.copy() else: bbox[0][0] = min(bbox[0][0], elem_bbox[0][0]) bbox[0][1] = min(bbox[0][1], elem_bbox[0][1]) bbox[1][0] = max(bbox[1][0], elem_bbox[1][0]) bbox[1][1] = max(bbox[1][1], elem_bbox[1][1]) return bbox ``` #### 拼接两个 Cell ```python def align_and_join_cells(cell1, cell2, target_layer, direction='horizontal'): # 获取指定图层的边界框 bbox1 = get_layer_bbox(cell1, target_layer) bbox2 = get_layer_bbox(cell2, target_layer) if bbox1 is None or bbox2 is None: raise ValueError("指定图层在某个cell中不存在") # 创建新cell new_cell = gdspy.Cell('Joined_Cell', overwrite_duplicate=True) # 添加第个cell new_cell.add(gdspy.CellReference(cell1)) # 计算偏移量 if direction == 'horizontal': offset_x = bbox1[1][0] - bbox2[0][0] offset_y = 0 elif direction == 'vertical': offset_x = 0 offset_y = bbox1[1][1] - bbox2[0][1] else: raise ValueError("方向必须为 'horizontal' 或 'vertical'") # 添加第二个cell偏移 new_cell.add(gdspy.CellReference(cell2, (offset_x, offset_y))) return new_cell ``` #### 生成所有可能的拼接组合 ```python import itertools def generate_all_combinations(cells, target_layer, direction='horizontal'): combined_cells = [] for pair in itertools.permutations(cells, 2): cell1, cell2 = pair combined_cell = align_and_join_cells(cell1, cell2, target_layer, direction) combined_cells.append(combined_cell) return combined_cells ``` #### 示例使用 ```python import gdspy # 读取 GDS 文件 lib = gdspy.GdsLibrary() lib.read_gds('example.gds') # 获取所有顶层 cell top_cells = lib.top_level() # 指定目标图层 target_layer = 1 # 生成所有水平拼接组合 horizontal_combinations = generate_all_combinations(top_cells, target_layer, direction='horizontal') # 生成所有垂直拼接组合 vertical_combinations = generate_all_combinations(top_cells, target_layer, direction='vertical') # 将所有拼接结果写入新 GDS 文件 output_lib = gdspy.GdsLibrary() for i, cell in enumerate(horizontal_combinations + vertical_combinations): output_lib.add(cell) output_lib.write_gds('joined_output.gds') ``` 上述代码实现了基于指定图层的对齐拼接逻辑,适用于所有可能的两两组合拼接情况。在实际应用中,可以进步扩展以支持多层对齐、自定义对齐点等高级功能。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值