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

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

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文件)


 

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);
			}
		}
	}
}


3、测试

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());
	}
}


 

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值