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

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

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