最近,学习了java的文件的一些基本操作,利用文件的基本知识做了一个小项目——文件搜索器

这个文件搜索器我默认是在D盘下面搜索,它一旦开始搜索,就不能停下来,这个会在学完线程之后进行完善,并加上时间条。

 

      文件,即File,位于java.io包下。文件到底指的是什么,在这里先声明一下:

1.文件的全名是包含文件的路径和扩展名的,但我们单独讲一个文件名是,是不包含路径但包含扩展名的;

2.在同一目录(就是同一文件夹)下,不会存在同名的目录和文件,如果强行为一个文件改成目录下已有的名字,系统会报错,终止重命名;

3.文件的路径包含相对目录和绝对目录:

  
    相对目录:不以路径分隔符开头的文件路径,需要使用取自其他路径名的信息来解析,默认情况下,java.io包中的类
                   总是根据当前用户的目录来解析相对路径名

    绝对目录:指以根目录开头的路径,是完整的路径名,不需要其他信息就可以定义文件的位置

    当前目录:指相对于程序运行时的目录算起的相对路径

 

       关于文件的扩展名,我曾经办过一件很搞笑的事情,当时虽然知道不同的文件会有不同的扩展名,但是仅此而已,我的手机只支持mp3格式的,但是有一个音乐文件只有wma的,我就把后面的扩展名给改了,放到手机里,自己觉得还挺得意的,结果还是不能识别,才知道文件格式绝对不仅仅是扩展名不同这么简单,这次学习,让我对文件有个更深刻的理解.

 

我们使用File时经常用到的有以下一些方法
       1.boolean exists()  测试此抽象路径名表示的文件或目录是否存在。
       2.String getAbsolutePath()  返回此抽象路径名的绝对路径名字符串。
       3.String getName() 返回由此抽象路径名表示的文件或目录的名称。
       4.boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。
       5.boolean isFile()   测试此抽象路径名表示的文件是否是一个标准文件。
       6.long length()   返回由此抽象路径名表示的文件的长度。 
       7.static File[] listRoots() 列出可用的文件系统根。 
       
        以下是文件搜索器的具体实现:

package cn.netjava.xySearchFile;

import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
 

 /**
  * 文件搜索器
  *
*/

public class FileShowUI extends javax.swing.JFrame{
	
	//定义一个面板属性
	private JPanel pl;
	//定义一个画布对象
	private java.awt.Graphics g;
	//创建一个SearchFile类的对象
	private  SearchFile sf;
	//创建一个保存路径的集合
	private  java.util.ArrayList<String> arrayList = new java.util.ArrayList<String>();
	//定义文件名字
	private  String name;
	//定义一个文本框组件
	private  JTextField jtf;
	
	/**
	 *主函数
	 * @param args
	 */
	public static void main(String[] args) {
		//创建主函数的对象
		FileShowUI fui = new FileShowUI();
		//调用显示界面的方法
		fui.showUI();
	}
	

	/**
	 * 文件搜索器的显示界面
	 */
	public void showUI(){
		//设定窗口的名字
		this.setTitle("我的文件搜索器");
		//设置显示窗口的大小
		this.setSize(600,500);
		//设定窗口居中显示
		this.setLocationRelativeTo(null);
		//将窗口固定大小
		this.setResizable(false);
		//不使用布局管理器
		this.setLayout(null);
		
		   
		//创建面板对象
		pl = new javax.swing.JPanel();
		//设置面板大小和显示位置
		pl.setBounds(0, 0, 600, 500);
		//设置面板的颜色
		pl.setBackground(java.awt.Color.LIGHT_GRAY);
		//将面板添加到界面上
		final JTextArea jta = new JTextArea(24, 48);
		//在面板上加个长度为10的输入框
		jtf=new JTextField(15);	
		//为面板添加按钮
		javax.swing.JButton search = new javax.swing.JButton("查找");
		javax.swing.JButton start = new javax.swing.JButton("开始搜索");
		javax.swing.JButton finish = new javax.swing.JButton("结束搜索");
		
		
		//将按钮添加到面板上
		pl.add(search);
		pl.add(jtf);
		pl.add(start);
		pl.add(finish);
		pl.add(jta);
		//将面板添加到画布上
		this.add(pl);
		//边框布局管理
		this.add(pl, BorderLayout.NORTH);   
        this.add(jta, BorderLayout.CENTER); 
 
		//滚动面板
		JScrollPane pane = new JScrollPane(jta);
		//设置面板的大小
		pane.setSize(new Dimension(550,400));
		pl.add(pane);

		
		sf = new SearchFile(arrayList);
		//给按钮添加监听器“匿名内部类”
		java.awt.event.ActionListener al=  new java.awt.event.ActionListener(){
        	public void actionPerformed(ActionEvent e) {
        		//获取用户输入要查找文件的名字
        		name = jtf.getText();
        		//默认为在D盘搜索
				int s = sf.search("D:\\",name);
				if(arrayList == null && arrayList.size()==0){
					jta.append("您所查找的文件不存在!\n");
					System.out.println("您所查找的文件不存在!");
				}else{
					for(int i=0; i < arrayList.size();i++){
						jta.append("文件:" + arrayList.get(i) + "\n");
					} 
				}
				jta.append("您所查找的文件总数为:"+ s);
				System.out.println("您所查找的文件总数为:"+ s);
        	}
       };
       start.addActionListener(al);

		
		//设置以上设置可见
		this.setVisible(true);
		
		//得到窗体上的画布类
		g = pl.getGraphics();
		
	}
	 
}

 

 

package cn.netjava.xySearchFile;
import java.io.File;



/**
 * 文件搜索器
 * @param args
 */
public class SearchFile  {
	//定义一个保存文件路径的队列
	private  java.util.ArrayList<String> arrayList = new  java.util.ArrayList<String>();
	
	//自定义构造函数
	public SearchFile(java.util.ArrayList<String>  arrayList){
		this.arrayList = arrayList;
		
	}

	/**
	 * 文件搜索的方法
	 */
	public int search(String fileName, String name){
		//把计数器初始化为0
		int count = 0;
		//如果没找到,
		if(name == null){
			return 0;
		}
		//创建一个文件类的对象
		File file = new File(fileName);
		//定义一个file数组,获取所有的文件目录
		File[] fileList = file.listFiles();
		//先判断数组是否为空
		if(null == fileList && fileList.length == 0){
			System.out.println("文件目录为空,请在其他文件中查找。");
			return 0;
		}else{
			for(int i=0; i< fileList.length; i++){
				//如果是文件
				if(fileList[i].isFile()){
					//获取文件的路径
					String filePath = fileList[i].getAbsolutePath();
					//如果文件与查找的文件名相同,就把路径添加到队列中
					if (filePath.indexOf(name) >= 0) {   
                        count++;   
                        arrayList.add(filePath);   
                    }   
				}
				//如果是目录
				if(fileList[i].isDirectory()){
					//获取目录的路径
					String path = fileList[i].getAbsolutePath();
					count += search(path,name);
				}
				 
			}
		}
		return count;
	}

	
	
	
}

 

 文件的界面见附件。