1 文件搜索
搜索D:\图片
目录中的.png
文件。
分析:
- 目录搜索,无法判断多少级目录,所以使用递归,遍历所有目录。
- 遍历目录时,获取的子文件,通过文件名称,判断是否符合条件。
代码示例:
import java.io.File;
/*
递归打印多级目录
搜素文件
只要.PNG格式的文件
*/
public class Recurison04 {
public static void main(String[] args) {
File file=new File("D:\\图片");
getAllFile(file);
}
/*
定义一个方法,参数传递File类型的目录
方法中对目录进行遍历
*/
private static void getAllFile(File dir) {
File[] files = dir.listFiles();
for (File f : files) {
//对遍历得到的File对象进行判断,判断是否是文件夹
if (f.isDirectory()){
/*f是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹、遍历文件夹的方法
所以直接调用getAllFile方法即可:递归(自己调用自己)*/
getAllFile(f);
}else{
//1.把File对象f转换为字符串对象(3种方法)
String n = f.getName();
//String p = f.getPath();
//String s = f.toString();
//将字符串转换为小写
String s = n.toLowerCase();
//2.调用String类中的方法endWith判断字符串是否以.PNG结尾
boolean b = s.endsWith(".png");
//3.如果是,则输出该文件
if (b) {
System.out.println(f);
}
//简单写法,链式
if (f.toString().toLowerCase().endsWith(".png")){
System.out.println(f);
}
}
}
}
}
运行结果:
2 文件过滤器优化
-
1.
File[] listFiles(FileFilter filter)
java.io.FilenameFilter
接口:实现此接口的类实力可用于抽象路径名(File对象)的过滤器。
作用:用来过滤文件(File对象)
抽象方法:用来过滤文件的方法
boolean accept(File pathname)
:测试指定抽象路径名是否应该包含在某个路径名列表中。
参数:File pathname
:使用listFiles方法遍历目录,得到的每一个文件对象 -
2.
File[] istFiles(FilenameFilter filter)
java.io.FilenameFilter
接口:实现此接口的类实力可用于文件名的过滤器。
作用:用于过滤文件名称
抽象方法:用来过滤文件的方法
boolean accept(File dir,String name)
:测定指定文件是否应包含在某一文件列表中。
参数:
File dir
:构造方法中传递的被遍历的目录
String name
:使用listFiles
方法遍历目录,获取的每一个文件/文件夹的名称
注意:两个过滤接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中定义过滤规则
分析:
- 接口作为参数,需要传递子类对象,重写其中方法。我们选择匿名内部类方式,比较简单。
accept
方法,参数为File,表示当前File下所有的子文件和子目录。保留住则返回true,过滤掉则返回false。保留规则:
a. 要么是.png文件。
b. 要么是目录,用于继续遍历。- 通过过滤器的作用,
listFiles(FileFilter)
返回的数组元素中,子文件对象都是符合条件的,可以直接打印。
实现类:
import java.io.File;
import java.io.FileFilter;
public class FileFilterImpl implements FileFilter {
@Override
public boolean accept(File pathname) {
/*
accept方法返回值是一个布尔值
true:就会把传递过去的File对象保存到File数组中
false:就不会把传递过去的File对象保存到File数组中
*/
//如果pathname是一个文件夹,返回true,继续遍历这个文件夹
if (pathname.isDirectory()){
return true;
}
return pathname.toString().toLowerCase().endsWith(".png");
}
}
测试类:
import java.io.File;
public class Recurison05 {
public static void main(String[] args) {
File file=new File("D:\\图片");
getAllFile(file);
}
/*
定义一个方法,参数传递File类型的目录
方法中对目录进行遍历
*/
private static void getAllFile(File dir) {
File[] files = dir.listFiles(new FileFilterImpl());
/*
listFiles方法一共做了三件事:
1.对构造方法中传递的目录进行遍历,获取目录中的每一个文件/文件夹,封装为File对象
2.调用参数传递的过滤器中的方法accept
3.把遍历得到的每一个File对象传递给accept方法的参数pathname
*/
for (File f : files) {
//对遍历得到的File对象进行判断,判断是否是文件夹
if (f.isDirectory()){
/*f是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹、遍历文件夹的方法
所以直接调用getAllFile方法即可:递归(自己调用自己)*/
getAllFile(f);
}else{
System.out.println(f);
}
}
}
}
3 匿名内部类优化
- FileFilter接口:
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
/*
使用匿名内部类优化
*/
public class Filter01 {
public static void main(String[] args) {
File file=new File("D:\\图片");
getAllFile(file);
}
/*
定义一个方法,参数传递File类型的目录
方法中对目录进行遍历
*/
private static void getAllFile(File dir) {
File[] files = dir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory()||pathname.toString().toLowerCase().endsWith(".png");
}
});
for (File f : files) {
//对遍历得到的File对象进行判断,判断是否是文件夹
if (f.isDirectory()){
/*f是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹、遍历文件夹的方法
所以直接调用getAllFile方法即可:递归(自己调用自己)*/
getAllFile(f);
}else{
System.out.println(f);
}
}
}
}
- FilenameFilter接口:
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
/*
使用匿名内部类优化
*/
public class Filter01 {
public static void main(String[] args) {
File file=new File("D:\\图片");
getAllFile(file);
}
/*
定义一个方法,参数传递File类型的目录
方法中对目录进行遍历
*/
private static void getAllFile(File dir) {
File[] files=dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir,name).isDirectory()||name.toString().toLowerCase().endsWith(".png");
}
});
for (File f : files) {
//对遍历得到的File对象进行判断,判断是否是文件夹
if (f.isDirectory()){
/*f是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹、遍历文件夹的方法
所以直接调用getAllFile方法即可:递归(自己调用自己)*/
getAllFile(f);
}else{
System.out.println(f);
}
}
}
}
4 Lambda优化
分析:FileFilter
是只有一个方法的接口,因此可以用lambda表达式简写。
lambda格式:
()->{ }
代码如下:
import java.io.File;
public class Filter01 {
public static void main(String[] args) {
File file=new File("D:\\图片");
getAllFile(file);
}
/*
定义一个方法,参数传递File类型的目录
方法中对目录进行遍历
*/
private static void getAllFile(File dir) {
//lambda简化
File[] files=dir.listFiles((File d, String name)->{
return new File(d,name).isDirectory()||name.toString().toLowerCase().endsWith(".png");
});
//lambda继续简化
File[] files=dir.listFiles(( d, name)->
new File(d,name).isDirectory()||name.toString().toLowerCase().endsWith(".png"));
for (File f : files) {
//对遍历得到的File对象进行判断,判断是否是文件夹
if (f.isDirectory()){
/*f是文件夹,则继续遍历这个文件夹。getAllFile方法就是传递文件夹、遍历文件夹的方法
所以直接调用getAllFile方法即可:递归(自己调用自己)*/
getAllFile(f);
}else{
System.out.println(f);
}
}