欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java实现文件批量重命名具体实例

程序员文章站 2024-02-25 21:05:45
windows操作系统可以实现重命名文件操作,却不能实现批量重命名。本实例实现了批量重命名功能,可以将一个文件夹内同一类型的文件按照一定的规则批量重命名。用户可以给出重命名...

windows操作系统可以实现重命名文件操作,却不能实现批量重命名。本实例实现了批量重命名功能,可以将一个文件夹内同一类型的文件按照一定的规则批量重命名。用户可以给出重命名模板,程序可以根据模板对相应的文件进行重命名。此外,还可以在重命名模板中添加特殊符号,程序会将这些特殊符号替换成重命名后的文件编号。

思路分析:

1.先看视图层,需要一些jlabel控件分别显示指示用户的信息,三个jtextfield控件分别显示所选路径、输入文件名模板即输入扩展名,两个jbutton控件分别用来浏览文件夹和开始重命名,一个jseparator控件表示分割线,一个jspinner控件代表开始编号,一个jscrollpane控件作为容器,在里面放置一个jtable控件列出旧文件名和新文件名。
2.再看模型层。首先定义浏览按钮的事件处理方法,在该方法中创建一个jfilechooser文件选择器,使用jfilechooser类的setfileselectionmode()方法设置只选择文件夹,通过jfilechooser类的showopendialog()显示打开对话框,若用户点击确认按钮则使用jfilechooser类的getselectedfile()方法获取选中的文件夹,最后使用jtextfield控件的settext()方法显示文件夹信息。
3.定义一个类来实现filefilter接口,在该类的构造方法中保存文件扩展名,然后定义一个方法,在该方法中使用string类的endswith()方法来过滤文件扩展名。
4.然后定义开始按钮的事件处理方法,首先使用jtextfield控件的gettext()方法获取模板字符串,若为空则通过joptionpane类的showmessagedialog()方法提示用户输入模板,然后创建defaulttablemodel对象并使用jtable类的getmodel()方法获取表格数据模型,用jtable类的setrowcount(0);方法清除表格数据,使用jspinner类的getvalue()方法获取起始编号,使用string类的indexof方法获取第一个“#”的索引,使用string类的substring()方法获取模板中数字占位字符串,使用string类的replace()方法把模板中数字占位字符串替换为指定格式,为了规范使用string类的tolowercase()方法将用户输入的扩展名转换为小写形式,若用户未输入“.”则补上,然后使用file类的listfiles()方法获取文件夹中的文件列表数组,使用foreach()循环遍历每个文件,通过string类的format()方法格式化每个文件名称,使用defaulttablemodel类的addrow()方法把文件的旧名称和新名称添加到表格的数据模型中,使用file类的getparentfile()方法获取目标文件所在的文件夹对象,创建一个file对象并初始化为新的文件名,最后使用file类的renameto()方法实现文件重命名。
代码如下:

复制代码 代码如下:

import java.awt.eventqueue;
import java.awt.event.actionevent;
import java.awt.event.actionlistener;
import java.io.file;
import java.io.filefilter;

import javax.swing.jbutton;
import javax.swing.jfilechooser;
import javax.swing.jframe;
import javax.swing.jlabel;
import javax.swing.joptionpane;
import javax.swing.jpanel;
import javax.swing.jscrollpane;
import javax.swing.jseparator;
import javax.swing.jspinner;
import javax.swing.jtable;
import javax.swing.jtextfield;
import javax.swing.border.emptyborder;
import javax.swing.table.defaulttablemodel;
import java.awt.gridbaglayout;
import java.awt.gridbagconstraints;
import java.awt.insets;

/**
 * 获取文件列表的过滤器
 * 
 * @author 李钟尉
 */
public class renamefiles extends jframe {

    /**
     * 
     */
    private static final long serialversionuid = 4534371106024773867l;

    private final class extnamefilefilter implements filefilter {
        private string extname;

        public extnamefilefilter(string extname) {
            this.extname = extname;// 保存文件扩展名
        }

        @override
        public boolean accept(file pathname) {
            // 过滤文件扩展名
            if (pathname.getname().touppercase()
                    .endswith(extname.touppercase()))
                return true;
            return false;
        }
    }

    private jpanel contentpane;
    private jtextfield forderfield;
    private jtextfield templetfield;
    private file dir;
    private jtable table;
    private jtextfield extnamefield;
    private jspinner startspinner;

    /**
     * launch the application.
     */
    public static void main(string[] args) {
        eventqueue.invokelater(new runnable() {
            public void run() {
                try {
                    renamefiles frame = new renamefiles();
                    frame.setvisible(true);
                } catch (exception e) {
                    e.printstacktrace();
                }
            }
        });
    }

    /**
     * create the frame.
     */
    public renamefiles() {
        setresizable(false);
        settitle("文件批量重命名");
        setdefaultcloseoperation(jframe.exit_on_close);
        setbounds(100, 100, 383, 409);
        contentpane = new jpanel();
        contentpane.setborder(new emptyborder(5, 5, 5, 5));
        setcontentpane(contentpane);
        gridbaglayout gbl_contentpane = new gridbaglayout();
        gbl_contentpane.columnwidths = new int[] { 72, 54, 60, 87, 91, 0 };
        gbl_contentpane.rowheights = new int[] { 25, 25, 10, 25, 24, 25, 2,
                216, 0 };
        gbl_contentpane.columnweights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0,
                double.min_value };
        gbl_contentpane.rowweights = new double[] { 0.0, 0.0, 0.0, 0.0, 0.0,
                0.0, 0.0, 0.0, double.min_value };
        contentpane.setlayout(gbl_contentpane);

        jlabel label = new jlabel();
        label.settext("文件批量重命名模块:");
        gridbagconstraints gbc_label = new gridbagconstraints();
        gbc_label.fill = gridbagconstraints.vertical;
        gbc_label.insets = new insets(0, 0, 5, 5);
        gbc_label.gridwidth = 3;
        gbc_label.gridx = 1;
        gbc_label.gridy = 0;
        contentpane.add(label, gbc_label);

        jlabel label_1 = new jlabel();
        label_1.settext("文件路径:");
        gridbagconstraints gbc_label_1 = new gridbagconstraints();
        gbc_label_1.anchor = gridbagconstraints.east;
        gbc_label_1.fill = gridbagconstraints.vertical;
        gbc_label_1.insets = new insets(0, 0, 5, 5);
        gbc_label_1.gridx = 0;
        gbc_label_1.gridy = 1;
        contentpane.add(label_1, gbc_label_1);

        forderfield = new jtextfield();
        forderfield.settext("");
        gridbagconstraints gbc_forderfield = new gridbagconstraints();
        gbc_forderfield.fill = gridbagconstraints.horizontal;
        gbc_forderfield.insets = new insets(0, 0, 5, 5);
        gbc_forderfield.gridwidth = 3;
        gbc_forderfield.gridx = 1;
        gbc_forderfield.gridy = 1;
        contentpane.add(forderfield, gbc_forderfield);

        jbutton button = new jbutton();
        button.addactionlistener(new actionlistener() {
            public void actionperformed(actionevent e) {
                do_button_actionperformed(e);
            }
        });
        button.settext("浏览");
        gridbagconstraints gbc_button = new gridbagconstraints();
        gbc_button.anchor = gridbagconstraints.northwest;
        gbc_button.insets = new insets(0, 0, 5, 0);
        gbc_button.gridx = 4;
        gbc_button.gridy = 1;
        contentpane.add(button, gbc_button);

        jseparator separator_1 = new jseparator();
        gridbagconstraints gbc_separator_1 = new gridbagconstraints();
        gbc_separator_1.fill = gridbagconstraints.both;
        gbc_separator_1.insets = new insets(0, 0, 5, 0);
        gbc_separator_1.gridwidth = 5;
        gbc_separator_1.gridx = 0;
        gbc_separator_1.gridy = 2;
        contentpane.add(separator_1, gbc_separator_1);

        jlabel label_5 = new jlabel();
        label_5.settext("使用#可以指定数字计数所占的位置,使用*可以插入原文件名:");
        gridbagconstraints gbc_label_5 = new gridbagconstraints();
        gbc_label_5.fill = gridbagconstraints.vertical;
        gbc_label_5.insets = new insets(0, 0, 5, 0);
        gbc_label_5.gridwidth = 5;
        gbc_label_5.gridx = 0;
        gbc_label_5.gridy = 3;
        contentpane.add(label_5, gbc_label_5);

        jlabel label_3 = new jlabel();
        label_3.settext("  模板:");
        gridbagconstraints gbc_label_3 = new gridbagconstraints();
        gbc_label_3.anchor = gridbagconstraints.east;
        gbc_label_3.fill = gridbagconstraints.vertical;
        gbc_label_3.insets = new insets(0, 0, 5, 5);
        gbc_label_3.gridx = 0;
        gbc_label_3.gridy = 4;
        contentpane.add(label_3, gbc_label_3);

        templetfield = new jtextfield();
        templetfield.settext("catrestaurant###");
        gridbagconstraints gbc_templetfield = new gridbagconstraints();
        gbc_templetfield.anchor = gridbagconstraints.south;
        gbc_templetfield.fill = gridbagconstraints.horizontal;
        gbc_templetfield.insets = new insets(0, 0, 5, 5);
        gbc_templetfield.gridwidth = 3;
        gbc_templetfield.gridx = 1;
        gbc_templetfield.gridy = 4;
        contentpane.add(templetfield, gbc_templetfield);

        jlabel label_4 = new jlabel();
        label_4.settext("开始于:");
        gridbagconstraints gbc_label_4 = new gridbagconstraints();
        gbc_label_4.fill = gridbagconstraints.vertical;
        gbc_label_4.insets = new insets(0, 0, 5, 5);
        gbc_label_4.gridx = 0;
        gbc_label_4.gridy = 5;
        contentpane.add(label_4, gbc_label_4);

        startspinner = new jspinner();
        gridbagconstraints gbc_startspinner = new gridbagconstraints();
        gbc_startspinner.fill = gridbagconstraints.horizontal;
        gbc_startspinner.insets = new insets(0, 0, 5, 5);
        gbc_startspinner.gridx = 1;
        gbc_startspinner.gridy = 5;
        contentpane.add(startspinner, gbc_startspinner);

        jlabel label_2 = new jlabel();
        label_2.settext("  扩展名:");
        gridbagconstraints gbc_label_2 = new gridbagconstraints();
        gbc_label_2.fill = gridbagconstraints.horizontal;
        gbc_label_2.insets = new insets(0, 0, 5, 5);
        gbc_label_2.gridx = 2;
        gbc_label_2.gridy = 5;
        contentpane.add(label_2, gbc_label_2);

        jbutton startbutton = new jbutton();
        startbutton.addactionlistener(new actionlistener() {
            public void actionperformed(actionevent e) {
                do_startbutton_actionperformed(e);
            }
        });

        extnamefield = new jtextfield();
        extnamefield.settext("jpg");
        gridbagconstraints gbc_extnamefield = new gridbagconstraints();
        gbc_extnamefield.fill = gridbagconstraints.horizontal;
        gbc_extnamefield.insets = new insets(0, 0, 5, 5);
        gbc_extnamefield.gridx = 3;
        gbc_extnamefield.gridy = 5;
        contentpane.add(extnamefield, gbc_extnamefield);
        startbutton.settext("开始");
        gridbagconstraints gbc_startbutton = new gridbagconstraints();
        gbc_startbutton.anchor = gridbagconstraints.north;
        gbc_startbutton.insets = new insets(0, 0, 5, 0);
        gbc_startbutton.gridx = 4;
        gbc_startbutton.gridy = 5;
        contentpane.add(startbutton, gbc_startbutton);

        jseparator separator_2 = new jseparator();
        gridbagconstraints gbc_separator_2 = new gridbagconstraints();
        gbc_separator_2.anchor = gridbagconstraints.north;
        gbc_separator_2.fill = gridbagconstraints.horizontal;
        gbc_separator_2.insets = new insets(0, 0, 5, 0);
        gbc_separator_2.gridwidth = 5;
        gbc_separator_2.gridx = 0;
        gbc_separator_2.gridy = 6;
        contentpane.add(separator_2, gbc_separator_2);

        jscrollpane scrollpane = new jscrollpane();
        gridbagconstraints gbc_scrollpane = new gridbagconstraints();
        gbc_scrollpane.fill = gridbagconstraints.both;
        gbc_scrollpane.gridwidth = 5;
        gbc_scrollpane.gridx = 0;
        gbc_scrollpane.gridy = 7;
        contentpane.add(scrollpane, gbc_scrollpane);

        table = new jtable();
        table.setmodel(new defaulttablemodel(new object[][] {}, new string[] {
                "旧文件名", "新文件名" }));
        scrollpane.setviewportview(table);
    }

    /**
     * 浏览按钮的事件处理方法
     * 
     * @param e
     */
    protected void do_button_actionperformed(actionevent e) {
        jfilechooser chooser = new jfilechooser();// 创建文件选择器
        // 设置只选择文件夹
        chooser.setfileselectionmode(jfilechooser.directories_only);
        int option = chooser.showopendialog(this);// 显示打开对话框
        if (option == jfilechooser.approve_option) {
            dir = chooser.getselectedfile();// 获取选择的文件夹
        } else {
            dir = null;
        }
        forderfield.settext(dir + "");// 显示文件夹信息
    }

    /**
     * 开始按钮的事件处理方法
     * 
     * @param e
     */
    protected void do_startbutton_actionperformed(actionevent e) {
        string templet = templetfield.gettext();// 获取模板字符串
        if (templet.isempty()) {
            joptionpane.showmessagedialog(this, "请确定重命名模板", "信息对话框",
                    joptionpane.warning_message);
            return;
        }
        // 获取表格数据模型
        defaulttablemodel model = (defaulttablemodel) table.getmodel();
        model.setrowcount(0);// 清除表格数据
        int bi = (integer) startspinner.getvalue();// 获取起始编号
        int index = templet.indexof("#");// 获取第一个“#”的索引
        string code = templet.substring(index);// 获取模板中数字占位字符串
        // 把模板中数字占位字符串替换为指定格式
        templet = templet.replace(code, "%0" + code.length() + "d");
        string extname = extnamefield.gettext().tolowercase();
        if (extname.indexof(".") == -1)
            extname = "." + extname;
        // 获取文件中文件列表数组
        file[] files = dir.listfiles(new extnamefilefilter(extname));
        for (file file : files) {// 变量文件数组
            // 格式化每个文件名称
            string name = string.format(templet, bi++) + extname;
            // 把文件的旧名称与新名称添加到表格的数据模型
            model.addrow(new string[] { file.getname(), name });
            file parentfile = file.getparentfile();// 获取文件所在文件夹对象
            file newfile = new file(parentfile, name);
            file.renameto(newfile);// 文件重命名
        }
    }
}

效果如图:

Java实现文件批量重命名具体实例