最近,学习了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; } }
文件的界面见附件。