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