您的位置:首页 > 编程语言 > Java开发

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

2012-01-19 15:59 501 查看
1、先看一个File类的简单的例子

[java] view plaincopy

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

[java] view plaincopy

<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、测试

[java] view plaincopy

<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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: