Java实现文件批量重命名具体实例
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);// 文件重命名
}
}
}
效果如图: