文件搜索器

文件搜索器

项目截图
文件搜索器

        大家都使用文件检索器,当我们找不到我们想到的文件时,我们最快就会想到使用文件检索,快速的查找我们想要的文件;所以功能很简单,大家都很熟悉;我就直接跟大家分享一下我的实现过程。

就两步骤完成:
一、 制作这文件搜索器面板
        首先可以看到这个面板上的组件,两个单行文本域,一个多行文本域,还加上一个按钮,具体的功能在面板上都已经注明了就不多说了。具体代码实现如下:
package FileOpearter;
import java.awt.FlowLayout;
import javax.swing.JFrame;

/**
 * 文件搜索器
 * @author Sean 2012-7-25
 *
 *作业:1、使用File类下的所以方法
 *		2、搜索指定文件夹下的包含指定字符串的文件
 */
public class MyFile extends JFrame {
	public static void main(String [] arge){
		 MyFile finefile = new MyFile();
		 finefile.setUI();
	}

	public void setUI() {
		/**
		 * 设置窗体基本属性
		 */
		this.setTitle("文件搜索");
		this.setSize(600, 400);
		this.setDefaultCloseOperation(3);
		/**
		 * 设置窗体布局——流式布局
		 */
		java.awt.FlowLayout jf = new java.awt.FlowLayout(FlowLayout.CENTER);
		this.setLayout(jf);
		/**
		 * 关键字输入框
		 */
		javax.swing.JLabel key = new javax.swing.JLabel("关 键 字:");
		javax.swing.JTextField keyfield = new javax.swing.JTextField(50);
		/**
		 * 指定目录
		 */
		javax.swing.JLabel path = new javax.swing.JLabel("定 位:");
		javax.swing.JTextField pathfield = new javax.swing.JTextField(50);
		/**
		 * 搜索按键
		 */
		javax.swing.JButton fine = new javax.swing.JButton("执行搜索");
		/**
		 * 显示文本域
		 */
		javax.swing.JTextArea dispaly = new javax.swing.JTextArea("显示结果如下:\n",30,50);
		dispaly.setLineWrap(true);
		/**
		 * 面板添加组件
		 */
		this.add(key);
		this.add(keyfield);
		this.add(path);
		this.add(pathfield);
		this.add(fine);
		this.add(dispaly);
		/**
		 * 可视化窗体
		 */
		this.setVisible(true);
		/**
		 * 为按键加监听器
		 */
		MouseLister mouselister = new MouseLister(keyfield,pathfield,dispaly);
		fine.addMouseListener(mouselister);
		
	}
}

二、 实现监听器
        下面来看一下监听器,监听器是为了监听“执行搜索”这个按钮的,当对象被触发时,相应的“文件搜索”事件就被激活了。那么“文件搜索”这个功能就可以监听器中来完成了。我们来看如何创建监听器及“文件搜索”这个功能的。首先,我们找准添加哪种监听器,现在我们比较熟悉和常用的就是鼠标监听器MouseListener和动作监听器ActionListener;对于这个实例来说两种监听器都可以实现;在这里我们选择鼠标监听器MouseListener吧!请看实例:
package FileOpearter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;

import javax.swing.JTextField;
/**
 * 鼠标监听器
 */

public class MouseLister implements MouseListener{
	private javax.swing.JTextField keyfield;
	private javax.swing.JTextField pathfield;
	private javax.swing.JTextArea dispaly ;
	///全局统计变量
	int count = 0;
	int dircount = 0;
	public MouseLister(JTextField keyfield, JTextField pathfield,javax.swing.JTextArea dispaly ) {
		super();
		this.keyfield = keyfield;
		this.pathfield = pathfield;
		this.dispaly = dispaly;
	}

	@Override
	public void mouseClicked(MouseEvent e) {
		
		// TODO Auto-generated method stub
		/**
		 * 鼠标单击时
		 */
		System.out.println(keyfield.getText());
		System.out.println(pathfield.getText());
		System.out.println("执行搜索!");
		/**
		 * 文件检索
		 */
		String key = keyfield.getText();
		String file = pathfield.getText();
		 
		
		finefile(file,key);
		if(count==0&&dircount==0)
		{System.out.println("没有找到!");
		
		dispaly.insert("没有找到!", 8) ;
		}
		else{ System.out.println("文件"+count+"个,文件夹"+dircount+"个");
		dispaly.insert("文件"+count+"个,文件夹"+dircount+"个", 8) ;}

	
	}
	/**
	 * 递归检索
	 */
	public void  finefile(String file,String key){
	
		
		
		// 如果表示的文件不存在
		java.io.File files = new java.io.File(file);
		if (!files.exists()) {
			return ;
		}
		// 将该文件夹下的所有文件装在一个文件数组中
		java.io.File[] fs = files.listFiles();

		// 如果返回的是null,表示file代表的不是一个文件夹
		if (fs == null) {
			return ;
		}
		
		
		// 遍历数组
		for (int i = 0; i < fs.length; i++) {
			java.io.File f = fs[i];
			// 得到文件的地址
			String str = f.getAbsolutePath();
			// 如果是一个标准文件
			if (f.isFile()) {				
				String filename = f.getName().toLowerCase();
				System.out.println(filename);
				if(filename.indexOf(key)!=-1)
					{System.out.println("找到啦  :"+f);
					dispaly.insert('\n'+"第"+(count+dircount+1)+"个  :"+f, 8);
					System.out.println(filename.indexOf(key));
					count++;
					
					}
				// 如果是一个文件夹
			} else if (f.isDirectory()) {
				String filename = f.getName().toLowerCase();
				if(filename.indexOf(key)!=-1)
					
					{dispaly.insert('\n'+"第"+(count+dircount+1)+"个  :"+f, 8);
					dircount++;System.out.println(filename.indexOf(key));
					
					}				
				// 递归调用
				file = str;
				finefile(str,key);
			}
		}
		return ;
	}
	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	}

        监听器创建成功,这个“文件搜索器”就由这两步骤完成了。
三、 分析总结
        实现的代码量很少,但是里面还是涉及到几个关键技术点:
1、 文件类的操作
        在java.io这个包下的类都是对输入输出流操作,而java.io.File这个类是Java 针对文件操作的一个最基础的类, 我们可以通过API文档来看File这个类,它下面包含了大量的方法,比较常用的方法有以下:
public boolean delete()  删除文件
public boolean createNewFile() 创建文件
public String[] list() 将指定路径下的文件或目录名存入字符串数组中
public File[] listFiles() 同样将指定路径下的文件或目录名存入文件数组中
public boolean mkdir() 创建指定目录
public boolean renameTo(File dest) 对指定文件重命名
public static File[] listRoots() 获得所有的根目录,也就是分区
public long getTotalSpace() 获得指定分区的大小
public long getFreeSpace() 获得指定分区空余大小
public int compareTo(File pathname) 按字母顺序比较路径
public long length() 测试指定文件的长度大小
public boolean isFile() 测试指定文件是否为标准文件
public boolean isDirectory() 测试指定文件是否为目录
public boolean exists() 测试指定文件或目录是否存在
public String getAbsolutePath() 返回指定文件的绝对路径
public boolean isAbsolute() 测试该路径名是否为绝对路径名
public String getPath() 返回指定文件的路径
public String getName() 返回指定文件的名字
public String getParent() 返回指定文件父目录的名字
public File getParentFile()返回指定文件父目录
        那么通过这些方法,可以对文件进行简单的操作,有时候我想这些方法看似简单,其实可以用来编写计算机病毒,例如我搜索某台计算机上的文件,找到一个比较大的文件,启动多个线程来往这个文件中写入数据,占满计算机上的物理空间,或者向内存中不断读入数据,占满计算机的内存,这个时候计算机肯定会变得越来越慢,到达一个时候使计算机崩溃掉。呵呵,这是一个设想,我不希望有人真的这样去做。

2、 文件的树形目录结构的访问

文件搜索器
        这是我的设计思路图,从这个图中不难看出,这是一个递归过程。在Windows下的目录结构都是树型目录,所以我们可以利用递归的方式来访问这棵树上的每一个结点。
3、 关键字的匹配
我们来看一下实例中的这一步
// 如果是一个标准文件
			if (f.isFile()) {				
				String filename = f.getName().toLowerCase();
				System.out.println(filename);
				if(filename.indexOf(key)!=-1)
					{System.out.println("找到啦  :"+f);
					dispaly.insert('\n'+"第"+(count+dircount+1)+"个  :"+f, 8);
					System.out.println(filename.indexOf(key));
					count++;
					
					}

         如果它是一个文件,就获取它的名字,再通过if(filename.indexOf(key)!=-1)比较,如果这个文件名的前几位字符包含key那么就表明找到了。关键技术在于这个indexOf方法。

你可能感兴趣的:(java)