java常用类解析五:IO系统File类及文件搜索工具类
1、先看一个File类的简单的例子
- <span style="font-size:16px;">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));
- }
- }
- }
- }
- </span>
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