java文件搜索器(初级)
??? 最近,学习了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){//把计数器初始化为0int 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;}}
?
?文件的界面见附件。