File和FilenameFilter
1.File的内涵
- 一个特定的文件
- 一个目录下的文件集合,可以用list()方法来查询这个文件集
2.FilenameFilter根据名称顾名思义,文件名过滤器
源代码
- 就一个accept(File dir, String name)方法,这个方法就是判断所给的文件名是否在文件目录下
@FunctionalInterface
public interface FilenameFilter {
/**
* Tests if a specified file should be included in a file list.
*
* @param dir the directory in which the file was found.
* @param name the name of the file.
* @return <code>true</code> if and only if the name should be
* included in the file list; <code>false</code> otherwise.
*/
boolean accept(File dir, String name);
1. 重点list()
通过装饰器增强list()方法,装饰器就是FilenameFilter 接口的实现类,增强使得list()代码内部能够调用accept(File dir, String name)方法
- list()源码如下
ublic String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
List<String> v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) {
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]);
}
解惑部分
-
之前一直没搞明白,i/o时怎么实现装饰器增强。原来就是把装饰器的对象传过去,在被装饰的对象内部就可以调用装饰器的方法了,这样就达到增强的效果。
-
除此之外,装饰器也需要被装饰者的信息,不然就达不到增强的效果(你都不给增强的对象给装饰者,装饰者怎么知道增强说,前面时把装饰者给了被增强者。)
-
昨天自己刚无意间学到lambda表达式来简化代码,其中一条就是函数式接口,FilenameFilter刚好是函数式接口,我自己改装了一下《Java编程思想》中的代码
它的代码用匿名类来实现简化,确实也可以借鉴。
public static void main(String[] args) {
/*
*遇见函数式接口,就可以用用lambda表达式来初始化
* 另一种玩法
* 这里就是用lambda表达式进行初始化的,很方便
* */
FilenameFilter filenameFilter= (File dir, String name)->{
String f= new File(name).getName();
return f.indexOf(name)!= -1;
};
try {
File path = new File(".");
String[] list;
if(args.length == 0)
list = path.list();
else
list = path.list(filenameFilter);
for(int i = 0; i < list.length; i++)
System.out.println(list[i]);
} catch(Exception e) {
e.printStackTrace();
}
}
关于File的应用
我自己写了一个小的demo,这个方法的作用是打印出某个目录下的所有文件,一直到该文件的最底层。
- 用于个人学习demo,不过之前自己也写过类似的demo,这次系统的学习Java i/o
public static void printAllFile(File file){
if (file.isDirectory()) {
String fileNames[];
fileNames = file.list();
String absoPath = file.getAbsolutePath();
for (String f : fileNames) {
File file1= new File(absoPath + "\\" + f);
if (file1.isFile()) {
System.out.println("文件名称:" + f);
// 这里的绝对路径文件,就是加上绝对路径的文件
//System.out.println("AbsoluteFile是啥啊"+file1.getAbsoluteFile());
}else if (file1.isDirectory()){
System.out.println(file.getName()+":是文件!");
printAllFile(file1);
}
}
}else return;
}