当前位置: 移动技术网 > IT编程>开发语言>Java > Java实现文件批量重命名具体实例

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

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);// 文件重命名
        }
    }
}

效果如图:

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网