java常用类解析五:IO系统File类及文件搜索工具类

1、先看一个File类的简单的例子

import java.io.File;  
import java.io.FilenameFilter;  
import java.util.Arrays;  
import java.util.Scanner;  
import java.util.regex.Pattern;  
  
/** 
 * File代表文件和目录,静态域有:与系统有关的路径分隔符、与系统有关的默认名称分隔符。 
 * 主要操作有:创建文件或目录、删除文件、给文件设定属性、返回指定目录下的文件列表、 
 *          返回过滤后的文件列表、 检测文件是否存在、是否隐藏、是否是目录还是文件、 
 *          返回文件名称和路径 
 *  
 * @author Touch 
 * 
 */  
public class FileDemo {  
    /* 
     * 查找指定路径下的匹配regex的文件 
     */  
    public String[] find(String path, final String regex) {  
        File file = new File(path);  
        //匿名内部类   
        return file.list(new FilenameFilter() {  
            private Pattern pattern = Pattern.compile(regex);  
            @Override  
            public boolean accept(File dir, String name) {  
                // TODO Auto-generated method stub   
                return pattern.matcher(name).matches();  
            }  
        });  
    }  
  
    public static void main(String[] args) {  
        String path = null;  
        String key = null;  
        String regex = null;  
        int choice = 1;  
        Scanner scanner = new Scanner(System.in);  
        System.out.println("please input the file path:");  
        path = scanner.next();  
        System.out.println("please input key:");  
        key = scanner.next();  
        System.out.println("choise:\n0:匹配以" + key + "为后缀的文件\n1:匹配包含" + key  
                + "的文件");  
        if ((choice = scanner.nextInt()) == 0)  
            regex = ".*\\." + key;  
        else  
            regex = ".*" + key + ".*";  
        String[] list;  
        list = new FileDemo().find(path, regex);  
        System.out.println(Arrays.deepToString(list));  
        //返回指定路径下的目录列表   
        File[] fileList = new File(path).listFiles();  
        for (File file : fileList) {  
            if (file.isDirectory()) {  
                list = new FileDemo().find(file.getPath(), regex);  
                System.out.println(Arrays.deepToString(list));  
            }  
        }  
    }  
  
}  
 

2、看完这个例子,是不是可以写个工具类呢,用于搜索指定路径下的所有文件或者目录,当然也可以输入正则表达式,这样就可以筛选出我们想要的文件(如有时候我们只需要.java文件或者.txt文件)

<span style="font-size:16px;">package mine.util;  
  
import java.io.File;  
import java.util.ArrayList;  
import java.util.List;  
  
/** 
 * FileDirectory类用于查找指定根目录下的所有文件和目录 可以通过正则表达式对要查找的 文件及目录进行筛选 
 *  
 * @author Touch 
 */  
public final class SearchFile {  
    // 存放文件   
    private List<File> fileList = new ArrayList<File>();  
    // 存放目录   
    private List<File> directoryList = new ArrayList<File>();  
    // 存放文件和目录   
    private List<File> list = new ArrayList<File>();  
    private File file;// 目录   
    private String regex;// 正则表达式   
  
    public SearchFile(String path) {  
        file = new File(path);  
        this.regex = ".*";  
    }  
  
    public SearchFile(File file) {  
        this.file = file;  
        this.regex = ".*";  
    }  
  
    public SearchFile(String path, String regex) {  
        file = new File(path);  
        this.regex = regex;  
    }  
  
    public SearchFile(File file, String regex) {  
        this.file = file;  
        this.regex = regex;  
    }  
  
    // 返回当前目录下的所有文件及子目录   
    public List<File> files() {  
        File[] files = file.listFiles();  
        List<File> list = new ArrayList<File>();  
        for (File f : files)  
            if (f.getName().matches(regex))  
                list.add(f);  
        return list;  
    }  
  
    // 返回该根目录下的所有文件   
    public List<File> allFiles() {  
        if (list.isEmpty())  
            search(file);  
        return fileList;  
    }  
  
    // 返回该根目录下的所有子目录   
    public List<File> allDirectory() {  
        if (list.isEmpty())  
            search(file);  
        return directoryList;  
    }  
  
    // 返回该根目录下的所有文件及子目录   
    public List<File> allFilesAndDirectory() {  
        if (list.isEmpty())  
            search(file);  
        return list;  
    }  
  
    // 递归搜索当前目录下的所有文件及目录   
    private void search(File file) {  
        File[] files = file.listFiles();  
        if (files == null || files.length == 0)  
            return;  
        for (File f : files) {  
            if (f.getName().matches(regex))  
                list.add(f);  
            if (f.isFile() && f.getName().matches(regex))  
                fileList.add(f);  
            else {  
                if (f.getName().matches(regex))  
                    directoryList.add(f);  
                search(f);  
            }  
        }  
    }  
}  
</span>  

 3、测试

 

<span style="font-size:16px;">package mine.util;  
  
import java.io.File;  
import java.util.List;  
  
public class TestSearchFile {  
    public static void main(String[] args) {  
        System.out.println("-------- 指定目录中所有文件及子目录-------");  
        List<File> list = (List<File>) new SearchFile(  
                "G:/java/workspace/test/file").files();  
        for (File file : list)  
            System.out.println(file.getName());  
        System.out.println("--------指定目录中以txt为后缀的文件------");  
        list = (List<File>) new SearchFile("G:/java/workspace/test/file",  
                ".*\\.txt").files();  
        for (File file : list)  
            System.out.println(file.getName());  
        System.out.println("--------以该目录为根目录的所有文件及子目录--");  
        list = (List<File>) new SearchFile("G:/java/workspace/test")  
                .allFilesAndDirectory();  
        for (File file : list)  
            System.out.println(file.getName());  
    }  
}  
</span>  

 

4、结果:

-------- 指定目录中所有文件及子目录-------
aa.data
bb.dat
object
test.txt
test1.txt
test2.txt
test3.txt
test4.txt
test5
--------指定目录中以txt为后缀的文件------
test.txt
test1.txt
test2.txt
test3.txt
test4.txt
--------以该目录为根目录的所有文件及子目录--
.classpath
.project
.settings
org.eclipse.jdt.core.prefs
bin
http
PassWord.class
Test.class
mine
util
SearchFile.class
TestSearchFile.class
test
A.class
ArraysDemo.class
B.class
ByteArrayInputStreamDemo.class
DataInputStreamAndByteArrayInputStreamDemo.class
DataInputStreamDemo.class
DeepCloneDemo.class
FileDemo$1.class
FileDemo.class
FileInputStreamDemo.class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值