最近在学习了文件对象的部分内容之后,掌握了对磁盘上文件的遍历,做了一个文件搜索器。
1.功能说明:
实现了通过输入文件名(带扩展名)对磁盘上所有待搜索的真实文件的搜索,以及对所有搜索结果的统计。
2.图片展示:
3.技术分析:
(1).使用了Swing组件里的菜单,使界面更为简洁.
// 加入菜单栏
javax.swing.JMenuBar jmb = new javax.swing.JMenuBar();
javax.swing.JMenu jm = new javax.swing.JMenu("控制");
javax.swing.JMenuItem item = new javax.swing.JMenuItem("开始");
(2).搜索功能的实现主要是对所选磁盘上的所有文件进行遍历,然后用其中的真实文件的名字与输入的名字比较,相同就输出到输出框上,其中对磁盘遍历是采用了递归的算法,具体代码如下:
package yfr.Fsearch315;
import java.awt.FlowLayout;
import java.io.File;
import javax.swing.JFrame;
/**
* 文件搜索器界面类
* @author Administrator
*
*/
public class SearchUI extends JFrame {
public static javax.swing.JTextField txt;
public static javax.swing.JTextArea result;
public static int count = 0;
private String[] root ;
public static javax.swing.JComboBox jcom ;
public static void main(String[] args) {
SearchUI UI = new SearchUI();
UI.showUI();
}
/**
* 显示界面的方法
*/
public void showUI() {
// 设置窗体属性
this.setTitle("Files Searching");
this.setSize(300, 320);
this.setDefaultCloseOperation(3);
this.setResizable(false);
// 设置布局管理器
FlowLayout fl = new FlowLayout();
this.setLayout(fl);
// 加入菜单栏
javax.swing.JMenuBar jmb = new javax.swing.JMenuBar();
javax.swing.JMenu jm = new javax.swing.JMenu("控制");
javax.swing.JMenuItem item = new javax.swing.JMenuItem("开始");
this.setJMenuBar(jmb);
jmb.add(jm);
jm.add(item);
// 创建3个JLabel 用以提示用户
javax.swing.JLabel lab1 = new javax.swing.JLabel("输入 ");
javax.swing.JLabel lab2 = new javax.swing.JLabel("输出 ");
javax.swing.JLabel lab3 = new javax.swing.JLabel("请选择盘符 ");
// 创建文本框,用来输入文件名
this.add(lab1);
txt = new javax.swing.JTextField(20);
this.add(txt);
// 创建文本框,用来打印搜索结果
this.add(lab2);
result = new javax.swing.JTextArea(10, 20);
result.setEditable(true);
result.setBackground(java.awt.Color.white);
//创建一个滚动条对象
javax.swing.JScrollPane spn = new javax.swing.JScrollPane(result);
this.add(spn);
// this.add(result);
//创建一个面板对象
javax.swing.JPanel select = new javax.swing.JPanel();
java.awt.Dimension dim = new java.awt.Dimension(100,20);
this.add(select);
listroot();
jcom = new javax.swing.JComboBox(root);
select.add(lab3);
select.add(jcom);
// 设置可见
this.setVisible(true);
// 创建一个搜索监听器
SearchListener slis = new SearchListener();
// 给菜单选项加上监听器
item.addActionListener(slis);
//给下拉框加上监听器
jcom.addActionListener(slis);
}
/**
* 获得机器的所有盘符
*/
public void listroot(){
final int rootnumber;//机器的盘符数
File opp = new File("");
File[] rootlist = opp.listRoots();
rootnumber = rootlist.length;
root = new String[rootnumber];
for(int i=0;i<rootlist.length;i++){
this.root[i] = rootlist[i].getAbsolutePath();
}
for(int i=0;i<rootlist.length;i++){
System.out.println(root[i]);
}
}
}
package yfr.Fsearch315;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
/**
* 文件搜索器的监听器类
* @author Administrator
*
*/
public class SearchListener implements java.awt.event.ActionListener{
private String name;
private String root="C:\\";
@Override
public void actionPerformed(ActionEvent e) {
this.name = SearchUI.txt.getText();
this.root = (String)SearchUI.jcom.getSelectedItem();
System.out.println(root);
SearchUI.count = 0;
if(e.getActionCommand().equals("开始")){
//listroot();
File opp = new File(root);
seek(opp);
SearchUI.result.append("共找到"+SearchUI.count+"个文件!");
}
}
/**
* 获得系统根目录,并在每个根目录下搜索名为name的文件
* @param s
* @return 每个名为name的文件的绝对路径
*/
/*private void listroot(){
//获得所有系统的根目录
File[] fs = opp.listRoots();
for(int i=0;i<fs.length;i++){
seek(fs[i]);
}
}*/
/**
* 搜索文件的方法
*/
private void seek(File opp){
File[] files = opp.listFiles();
if(files==null||files.length==0)
return;
for(int i=0;i<files.length;i++){
if(files[i].isDirectory()){
seek(files[i]);
}else if(files[i].isFile()&&(files[i].getName().equals(this.name))){
System.out.println(files[i].getAbsolutePath());
SearchUI.result.append(files[i].getAbsolutePath()+"\r\n");
SearchUI.count++;
}
}
return;
}
}
4.待解决的问题:
(1).目前还是只能在某个磁盘上进行搜索,还不能具体选择某个文件夹进行搜索。
(2).还不能实现搜索过程的暂停。