java编程思想 IO1源码

目录列表器与目录过滤器的运用
package com.dirlist;

import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;
/*  args=D.*\.java   */
public class DirList {

/**
* 目录列表器与目录过滤器
*/
public static void main(String[] args) {
File path=new File("src/com/dirlist");

String[] fileList = null;
if(args.length==0){
System.out.println("没有默认初始值");
//返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。
fileList=path.list();
}else{
System.out.println("有默认初始值");

//返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的。
//当且仅当在此抽象路径名和它所表示的目录中的文件名或目录名上调用过滤器的 FilenameFilter.accept(java.io.File, java.lang.String)
//方法返回 true 时,该名称才满足过滤器。
fileList=path.list(new DirFilter(args[0]));
System.out.println(fileList.length);
}
//此类包含用来操作数组(比如排序和搜索)的各种方法。此类还包含一个允许将数组作为列表来查看的静态工厂。
//根据指定比较器产生的顺序对指定对象数组进行排序。
//String.CASE_INSENSITIVE_ORDER是一个排序 String 对象的 Comparator,它的作用与 compareToIgnoreCase 相同。该比较器是可序列化的。
Arrays.sort(fileList,String.CASE_INSENSITIVE_ORDER);
for(String dirItem:fileList){
System.out.println(dirItem);
}

}
}
class DirFilter implements FilenameFilter{
//Pattern正则表达式的编译表示形式。
private Pattern pattern;
public DirFilter(String regex){
//指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象
//将给定的正则表达式编译到模式中。
pattern=Pattern.compile(regex);
}
public boolean accept(File dir, String name) {

System.out.println(dir.getAbsolutePath());
//创建匹配给定输入与此模式的匹配器,并且尝试将整个区域与模式匹配。
System.out.println(pattern.matcher(name).matches());
return pattern.matcher(name).matches();
}
创建DirFilter类的目的在于将accept()方法提供给list()使用,使list()可以回调accept()方法。list()方法会为此目录下的所有文件名调用accept()方法,来判断是否符合你定义的目录过滤器。判断结果由accept()返回的布尔值表示。


FilenameFilter.accept(java.io.File, java.lang.String) 源码解析:

public String[] list(FilenameFilter filter) {
String names[] = list();//File.list()返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。

if ((names == null) || (filter == null)) {
    return names;
}//如果返回的字符串数组或目录过滤器为空,则返回字符串数组
ArrayList v = new ArrayList();
for (int i = 0 ; i < names.length ; i++) {
    if (filter.accept(this, names[i])) {
v.add(names[i]);//如果满足过滤条件,则插入
    }
}
return (String[])(v.toArray(new String[v.size()]));//将满足过滤器的目录名或文件名转化为字符串数组并返回
    }
利用匿名内部类实现:
DirList2.java
package com.dirlist;

import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;

public class DirList2 {

/**
*利用匿名内部类
*/
//传向filte的参数必须是final的。这在匿名内部类中是必需的,只有这样匿名内部类才能使用来自类范围之外的对象
public static FilenameFilter filter(final String regex){
return new FilenameFilter(){
private Pattern pattern=Pattern.compile(regex);
public boolean accept(File dir, String name) {
return pattern.matcher(name).matches();
}
};
}
public static void main(String[] args) {
File path=new File("src/com/dirlist");
String[] fileList=null;
if(args.length==0){
fileList=path.list();
}else{
fileList=path.list(DirList2.filter(args[0]));
}
Arrays.sort(fileList, String.CASE_INSENSITIVE_ORDER);
for(String fileItem:fileList){
System.out.println(fileItem);
}

}

}
DirList3.java
package com.dirlist;

import java.io.File;
import java.io.FilenameFilter;
import java.util.Arrays;
import java.util.regex.Pattern;

public class DirList3 {

/**
* @param args
*/
public static void main(final String[] args) {
File path=new File("src/com/dirlist");
String[] fileList=null;
if(args.length==0){
fileList=path.list();
}else{
fileList=path.list(new FilenameFilter(){
private Pattern pattern=Pattern.compile(args[0]);
public boolean accept(File dir, String name) {
return pattern.matcher(name).matches();
}
});
}
Arrays.sort(fileList,String.CASE_INSENSITIVE_ORDER);
for(String fileItem:fileList){
System.out.println(fileItem);
}

}

}

希望对大家有用!!!

你可能感兴趣的:(java,编程,正则表达式)