Java快速批量移动文件的实现方法
文件移动是计算机资源管理常用的一个操作,这在操作系统中可以通过文件的剪切与复制或鼠标拖动来实现。但是在java文件的编程实现中,大多是通过复制文件到目的地,再删除所有文件来实现的。这对于小文件来说看不出什么弊端,但是如果移动几个大的文件,则会使操作缓慢并且浪费系统资源。本实例将通过file类的renameto()方法直接实现文件的快速移动,哪怕是移动几gb的文件也不会需要等待太长时间。
思路分析:
首先是视图层。在这里有个建议,因为在某些控件的事件中,常常会访问其他控件,且控件的事件方法用到的参数几乎就是固定的actionevent类,很少传递别的参数。因此即使视图是用拖动控件自动生成的,也要在代码中把这些控件设为类的成员变量。在本实例中,要用到jpanel控件作为其他控件的容器,jlabel控件用来显示固定信息,jtextfield控件用来显示要移动的文件和目标文件夹,jbutton控件用来选择源文件夹、目标文件夹以及实现移动和关闭程序,jscrollpane用来显示条形柱,以及jtextarea控件用来显示操作记录。
然后是模型层。对于浏览按钮,要获取源文件夹中的文件名数组和目标文件夹的路径,这就需要定义一个file型数组成员变量保存文件名,再定义一个file型成员变量保存目标路径。
选择源文件的浏览按钮后,首先创建一个jfilechooser文件选择器,使用jfilechooser类的setmultiselectionenabled(true);方法设置可以多选,通过jfilechooser类的showopendialog(this);方法显示文件选择对话框,若用户确认则使用jfilechooser类的getselectedfiles()方法获取选中的文件数组并赋值给之前定义的file型数组成员变量,通过jtextfield()类的settext("")方法清空文本框以除去上一次操作的记录,新建一个stringbuilder对象,使用foreach()循环遍历文件数组,通过stringbuilder类的append()方法连接文件名称,因为最前面多了个“、”,再使用stringbuilder类的substring()方法获取所有文件名称的字符串,通过jtextfieldl类的settext()方法将文件名称字符串显示到文本框。
对于选择目标文件夹的浏览按钮,首先创建一个jfilechooser文件选择器,使用jfilechooser类的setfileselectionmode()方法设置选择器只对文件夹生效,通过jfilechooser类的showopendialog()方法显示文件打开对话框,使用jfilechooser类的getselectedfile()方法获取选择的文件夹,最后用jtextfield控件的settext()方法显示文件夹到文本框。
对于移动按钮的事件处理方法,首先使用数组的length属性判断文件数组有无元素,若有则使用foreach()循环遍历文件数组,对数组中的每一个文件元素创建移动目标文件,通过jtextarea控件的append()方法显示移动记录,使用file类的renameto()方法实现文件移动,最后使用jtextarea控件的append()方法显示移动完成信息。
对于关闭按钮的事件处理方法,使用system类的exit()方法退出程序。
代码如下:
import java.awt.eventqueue;
public class quickmovefiles extends jframe {
/**
*
*/
private static final long serialversionuid = -666045931923008374l;
private jpanel contentpane;
private jtextarea infoarea;
private jtextfield sourcefolderfield;
private jtextfield targetfolderfield;
private file[] files;
private file dir;
/**
* launch the application.
*/
public static void main(string[] args) {
eventqueue.invokelater(new runnable() {
public void run() {
try {
quickmovefiles frame = new quickmovefiles();
frame.setvisible(true);
} catch (exception e) {
e.printstacktrace();
}
}
});
}
/**
* create the frame.
*/
public quickmovefiles() {
settitle("\u5feb\u901f\u6279\u91cf\u79fb\u52a8\u6587\u4ef6");
setdefaultcloseoperation(jframe.exit_on_close);
setbounds(100, 100, 507, 299);
contentpane = new jpanel();
contentpane.setborder(new emptyborder(5, 5, 5, 5));
setcontentpane(contentpane);
gridbaglayout gbl_contentpane = new gridbaglayout();
gbl_contentpane.columnwidths = new int[] { 0, 178, 0, 0, 0, 0 };
gbl_contentpane.rowheights = new int[] { 0, 0, 169, 0, 0 };
gbl_contentpane.columnweights = new double[] { 0.0, 1.0, 0.0, 0.0, 0.0,
double.min_value };
gbl_contentpane.rowweights = new double[] { 0.0, 0.0, 1.0, 0.0,
double.min_value };
contentpane.setlayout(gbl_contentpane);
jlabel label = new jlabel("\u9009\u62e9\u6e90\u6587\u4ef6\uff1a");
gridbagconstraints gbc_label = new gridbagconstraints();
gbc_label.anchor = gridbagconstraints.east;
gbc_label.insets = new insets(0, 0, 5, 5);
gbc_label.gridx = 0;
gbc_label.gridy = 0;
contentpane.add(label, gbc_label);
sourcefolderfield = new jtextfield();
gridbagconstraints gbc_sourcefolderfield = new gridbagconstraints();
gbc_sourcefolderfield.gridwidth = 3;
gbc_sourcefolderfield.insets = new insets(0, 0, 5, 5);
gbc_sourcefolderfield.fill = gridbagconstraints.horizontal;
gbc_sourcefolderfield.gridx = 1;
gbc_sourcefolderfield.gridy = 0;
contentpane.add(sourcefolderfield, gbc_sourcefolderfield);
sourcefolderfield.setcolumns(10);
jbutton browserbutton1 = new jbutton("\u6d4f\u89c8");
browserbutton1.addactionlistener(new actionlistener() {
public void actionperformed(actionevent e) {
do_browserbutton1_actionperformed(e);
}
});
gridbagconstraints gbc_browserbutton1 = new gridbagconstraints();
gbc_browserbutton1.insets = new insets(0, 0, 5, 0);
gbc_browserbutton1.gridx = 4;
gbc_browserbutton1.gridy = 0;
contentpane.add(browserbutton1, gbc_browserbutton1);
jlabel label_1 = new jlabel(
"\u9009\u62e9\u76ee\u6807\u6587\u4ef6\u5939\uff1a");
gridbagconstraints gbc_label_1 = new gridbagconstraints();
gbc_label_1.anchor = gridbagconstraints.east;
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);
targetfolderfield = new jtextfield();
gridbagconstraints gbc_targetfolderfield = new gridbagconstraints();
gbc_targetfolderfield.gridwidth = 3;
gbc_targetfolderfield.insets = new insets(0, 0, 5, 5);
gbc_targetfolderfield.fill = gridbagconstraints.horizontal;
gbc_targetfolderfield.gridx = 1;
gbc_targetfolderfield.gridy = 1;
contentpane.add(targetfolderfield, gbc_targetfolderfield);
targetfolderfield.setcolumns(10);
jbutton browserbutton2 = new jbutton("\u6d4f\u89c8");
browserbutton2.addactionlistener(new actionlistener() {
public void actionperformed(actionevent e) {
do_browserbutton2_actionperformed(e);
}
});
gridbagconstraints gbc_browserbutton2 = new gridbagconstraints();
gbc_browserbutton2.insets = new insets(0, 0, 5, 0);
gbc_browserbutton2.gridx = 4;
gbc_browserbutton2.gridy = 1;
contentpane.add(browserbutton2, gbc_browserbutton2);
jlabel label_2 = new jlabel("\u64cd\u4f5c\u8bb0\u5f55\uff1a");
gridbagconstraints gbc_label_2 = new gridbagconstraints();
gbc_label_2.anchor = gridbagconstraints.east;
gbc_label_2.insets = new insets(0, 0, 5, 5);
gbc_label_2.gridx = 0;
gbc_label_2.gridy = 2;
contentpane.add(label_2, gbc_label_2);
jscrollpane scrollpane = new jscrollpane();
gridbagconstraints gbc_scrollpane = new gridbagconstraints();
gbc_scrollpane.gridwidth = 4;
gbc_scrollpane.insets = new insets(0, 0, 5, 0);
gbc_scrollpane.fill = gridbagconstraints.both;
gbc_scrollpane.gridx = 1;
gbc_scrollpane.gridy = 2;
contentpane.add(scrollpane, gbc_scrollpane);
infoarea = new jtextarea();
scrollpane.setviewportview(infoarea);
jbutton movebutton = new jbutton("\u79fb\u52a8");
movebutton.addactionlistener(new actionlistener() {
public void actionperformed(actionevent e) {
do_movebutton_actionperformed(e);
}
});
gridbagconstraints gbc_movebutton = new gridbagconstraints();
gbc_movebutton.insets = new insets(0, 0, 0, 5);
gbc_movebutton.gridx = 1;
gbc_movebutton.gridy = 3;
contentpane.add(movebutton, gbc_movebutton);
jbutton closebutton = new jbutton("\u5173\u95ed");
closebutton.addactionlistener(new actionlistener() {
public void actionperformed(actionevent e) {
do_closebutton_actionperformed(e);
}
});
gridbagconstraints gbc_closebutton = new gridbagconstraints();
gbc_closebutton.insets = new insets(0, 0, 0, 5);
gbc_closebutton.gridx = 2;
gbc_closebutton.gridy = 3;
contentpane.add(closebutton, gbc_closebutton);
}
/**
* 选择源文件的浏览按钮
*
* @param e
*/
protected void do_browserbutton1_actionperformed(actionevent e) {
jfilechooser chooser = new jfilechooser();// 创建文件选择器
chooser.setmultiselectionenabled(true);// 设置文件多选
int option = chooser.showopendialog(this);// 显示文件打开对话框
if (option == jfilechooser.approve_option) {
files = chooser.getselectedfiles();// 获取选择的文件数组
sourcefolderfield.settext("");// 清空文本框
stringbuilder filesstr = new stringbuilder();
for (file file : files) {// 遍历文件数组
filesstr.append("、" + file.getname());// 连接文件名称
}
string str = filesstr.substring(1);// 获取所有文件名称的字符串
sourcefolderfield.settext(str);// 设置文件名称信息到文本框
} else {
files = new file[0];
sourcefolderfield.settext("");// 清空文本框
}
}
/**
* 选择目标文件夹的浏览按钮
*
* @param e
*/
protected void do_browserbutton2_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();// 获取选择的文件夹
targetfolderfield.settext(dir.tostring());// 显示文件夹到文本框
} else {
dir = null;
targetfolderfield.settext("");
}
}
/**
* 关闭按钮的事件处理方法
*
* @param e
*/
protected void do_closebutton_actionperformed(actionevent e) {
system.exit(0);
}
/**
* 移动按钮的事件处理方法
*
* @param e
*/
protected void do_movebutton_actionperformed(actionevent e) {
if (files.length <= 0 || dir == null)// 判断文件数组有无元素
return;
for (file file : files) {// 遍历文件数组
file newfile = new file(dir, file.getname());// 创建移动目标文件
infoarea.append(file.getname() + "\t移动到\t" + dir);// 显示移动记录
file.renameto(newfile);// 文件移动
infoarea.append("------完成\n");// 显示移动完成信息
}
// 显示操作完成
infoarea.append("##################操作完成###################\n");
}
}
效果如图: