用Swing做一个文件比对程序

 

 

我现在做web开发,老大给我一个任务,之前我们有两台服务器(240,253),两台服务器有同样的一个项目,因为之前项目的修改都update到了 240,而253的没有更新,从而两个服务器中的项目不一致,现在老大说要从这两台服务器把不一样的文件路径(文件名)给找出来,之前我
Editplus自带的比对工具,一个一个文件的比对,工作率非常大。项目很大,文件又很多,这样子非把我给逼死了,搞得两眼红肿。然后自己写个程序,只要输入目录名,就把所有的目录中的文件进行比配。从中可以解决问题,但是中实现的方式来看,我觉得还是存在很多的不足。先look代码吧!

package comparefolders;

import java.awt.EventQueue;
import java.awt.FileDialog;
import java.awt.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;

import javax.swing.*;

/**
 * 文件比对,找出不比配的文件或者不存在的文件。
 * @author admin
 */
public class FileDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        EventQueue.invokeLater(new Runnable() {
            public void run() {
                JFrame frame = new FileThanTest();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setVisible(true);
            }
        });
    }
}

class FileThanTest extends JFrame {

    //窗口WIDTH
    private static final int WIDTH = 800;
    //窗口height
    private static final int HEIGHT = 800;
    //最新项目目录路径
    private static JTextField pathTF1 = new JTextField(20);
    //旧项目目录路径
    private static JTextField pathTF2 = new JTextField(20);
    //存储最新的项目文件所有文件路径
    private static java.util.List<String> paths = null;
    //比配信息,输出不比配的行
    private static JTextArea textArea = new JTextArea(30, 70);
    //输出不比配的文件路径
    private static JTextArea textArea2 = new JTextArea(8, 70);
    
    private static JLabel newObjectPath = new JLabel("最新版本:");

    private static JLabel oldObjectPath = new JLabel("旧版本:");
    //比配按钮
    JButton searchFile2 = new JButton("比对");
    //配置文件文件后缀名
    private static final String suffixNames[] = {".jsp",".html",".css",".java",".js",".jpg"};
    //
    JComboBox cmbSuffixName = new JComboBox(suffixNames);

    public FileThanTest() {

        setTitle("king SoftWare");
        setSize(WIDTH, HEIGHT);
        setResizable(false);
        paths = new ArrayList<String>();
        JPanel panel = new JPanel();
        JButton searchFile1 = new JButton("Search1");
        //设置cmbSuffixName文件后缀名可编辑
        cmbSuffixName.setEditable(true);
        searchFile1.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                // 文件路径
                // pathTF1.setText(showDiaLog());
            }
        });
        //比配按钮事件
        searchFile2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                //最新项目目录文件路径不能为空
                if (pathTF1.getText().length() == 0)return;
                //旧项目目录文件路径不能为空
                if (pathTF2.getText().length() == 0)return;
                
                final String path1 = pathTF1.getText();
                final String path2 = pathTF2.getText();
                textArea.setText("");
                textArea2.setText("");
                // 如果paths存储的路径不等于null,清除之前在内存的路径
                if (paths != null)paths.clear();
                //判断路径是否存在
                File f = new File(path1);
                if(!f.exists()){textArea.setText("文件目录:" + path1 + "不存在!");return;}
                f = new File(path2);
                if(!f.exists()){textArea.setText("文件目录:" + path1 + "不存在!");return;}
                //操作中比配按钮不可用
                searchFile2.setEnabled(false);
                // 读取最新文件路径到内存中
                getAllFile(pathTF1.getText());
                //如果不存在指定的文件就return
                if(paths.size() == 0) {
                    textArea.setText("找不到"+ cmbSuffixName.getSelectedItem() +"文件!");
                    searchFile2.setEnabled(true);
                    return;
                }
                if (paths.size() != 0) {
                    new Thread() {
                        public void run() {

                            // TODO Auto-generated method stub
                            for (int i = 0; i < paths.size(); i++) {
                                String pathString = paths.get(i);
                                String patString2 = pathString.substring(path1.length());
                                //调用比配方法
                                contrast(pathString, path2 + patString2);
                                //比配完所有文件按钮比配可用
                                if(i == paths.size()-1)searchFile2.setEnabled(true);
                            }
                        }
                    }.start();
                }
            }
        });
        panel.add(newObjectPath);
        panel.add(pathTF1);
        // panel.add(searchFile1);
        panel.add(oldObjectPath);
        panel.add(pathTF2);
        panel.add(cmbSuffixName);
        panel.add(searchFile2);
        panel.add(new JScrollPane(textArea));
        panel.add(new JScrollPane(textArea2));
        add(panel);
    }

    /**
     * 创建文件对话框
     * @return
     */
    public String showDiaLog() {
        FileDialog dialog = new FileDialog(FileThanTest.this);
        // 设置此文件对话框的目录默认值
        dialog.setDirectory(".");
        dialog.setVisible(true);
        // 获取此文件对话框的目录。
        String str = dialog.getDirectory();
        // 获取此文件对话框的选定文件
        String fileName = dialog.getFile();
        if (str == null || fileName == null)
            return null;
        return str + fileName;
    }

    /**
     * 根据传入两个文件路径进行比配
     * 此方法对两个File进行对比
     * @param f1
     * @param f2
     */
    public void contrast(String f1, String f2) {
        FileReader reader1 = null;
        FileReader reader2 = null;
        try {
            reader1 = new FileReader(f1);
            reader2 = new FileReader(f2);
        } catch (Exception e) {
            textArea2.append(f2 + " not exists!\n");
            System.err.println(f2 + " not exists!");
            return;
        }
        // 创建inOne1一个文件缓冲器
        BufferedReader inOne1 = new BufferedReader(reader1);
        // 创建inTow2一个文件缓冲器
        BufferedReader inTow2 = new BufferedReader(reader2);

        String s1 = null;
        String s2 = null;
        // 行数
        int line = 0;
        // 是否存在不同比对
        boolean b = false;
        try {
            while ((s1 = inOne1.readLine()) != null) {
                line++;
                s2 = inTow2.readLine();
                if (!(s1.equals(s2))) {
                    b = true;
                    textArea.append("第 " + line + " 行" + s1 + " 和 " + s2
                            + "\n");
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
            textArea.append("read file error!\n");
        }
        if (b == true) {
            textArea.append("================================================================================");
            textArea2.append(f1 + " 和 " + f2 + "存在不一样的文件!\n");
            System.err.println(f1 + " 和 " + f2 + "存在不一样的文件!\n");
        }
    }

    /**
     * 从最新的项目获取给指定后缀的所有文件。
     * 把这些文件放入内存中。
     * @param fileName
     */
    public void getAllFile(String fileName) {
        // TODO Auto-generated method stub
        File file = new File(fileName);
        String suffiName = cmbSuffixName.getSelectedItem().toString();
        //如果时目录文件
        if(file.isDirectory()){
            File[] files = file.listFiles();
            if (files == null) {
                textArea.setText("file not exists error!");
                return;
            }
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) {
                    getAllFile(files[i].getAbsolutePath());
                }else{
                    //判断是否时指定的后缀的文件
                    if (files[i].getName().endsWith(suffiName)) {
                        paths.add(files[i].getAbsolutePath());
                    }
                }
            }
        }else{
            // 判断是否时指定的后缀的文件
            if (file.getName().endsWith(suffiName)) {
                paths.add(file.getAbsolutePath());
            }
        }
    }
}

首先诚心的说声“非常抱歉”由于我也算是没多少经验的编程人员,可能我写的代码很难读懂,进来了,要留下些东西哦!我很希望各位能给我一些提议。

下面是我实现这个程序的思路:
1.获取最新项目的目录路径。
2.调用getAllFile(String)把“最新”项目目录下的所有文件读取到内存中。
3.在调用contrast(String,String)进行文件比对,第一个参数是“最新”项目文件路径从内存中读取,因为都是同一个项目,第二个参数“旧”项目文件路径和第一个参数路径相同。
4.读取两个文件,一行一行的比对。

如果文件数量多的话是不是存在一些bug?
希望各位朋友能给我提一些问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值