FilenameFilter和FileFilter都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码:通过使用File类中String[] list(FilenameFilter filter)或者public File[] listFiles(FileFilter filter)方法,把FilenameFilter或者FileFilter接口对象作为参数传入,通过实现接口里面的 boolean accept(File dir, String name) 或者boolean accept(File pathname)方法来过滤出满足条件的文件:区别:FilenameFilter的性能比FileFilter的好.
/**
File类:
* 使用 String[] list(FilenameFilter filter)遍历指定目录下面,指定的后缀的文件。
底层怎么实现过滤的?
String[] list(FilenameFilter filter)
原理:先把目录下面的文件调用list()方法全部存放到一个String[]数组里面,然后遍历数组,
把符合filter.accept(this, names[i])条件的放到一个ArrayList里面,然后把
List转化为String[]数组
底层源码解析:
public String[] list(FilenameFilter filter) {
String names[] = list();//把所有目录文件列出来
if ((names == null) || (filter == null)) {//如果没有目录或者文件,返回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]);/把满足条件的放到List集合中
}
}
return (String[])(v.toArray(new String[v.size()]));
}
* FilenameFilter 接口
* 接口方法:
* boolean accept(File dir,String name) 可以使用此方法列出指定目录下面的带有某些后缀的文件。
参数:
dir - 被找到的文件所在的目录。
name - 文件的名称。
返回:
当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。
*
*/
代码:
1.需求找出某个路径下面以.java结尾的文件。
实现:FilenameFilter 接口:
package com.lp.ecjtu.File.filter; import java.io.File; import java.io.FilenameFilter; public class FileterByJava implements FilenameFilter { private String SufixName;//传入过滤的名称 public FileterByJava(String SufixName){ this.SufixName = SufixName; } @Override public boolean accept(File dir, String name) { //System.out.println("dir"+dir+"_____"+"name"+name);//返回dir:E:\workspace\IOTest_____name:buf.txt } }
package com.lp.ecjtu.File.filter; import java.io.File; import java.io.FilenameFilter; public class FileListFilter { public static void main(String[] args){ ListFileFileterByjava(); } /** * * 使用实现FilenameFilter接口的方法, * 过滤String[] list(FilenameFilter filter) * 文件名过滤 */ public static void ListFileFileterByjava(){ File f = new File("E:"+File.separator+"workspace"+File.separator+"IOTest"); String[] fileNames = f.list(new FileterByJava(".java"));//使用具体对象,把过滤后的以.java文件的文件放到数组当中 System.out.println(fileNames.length);//含有.java文件数组的长度 for(String name:fileNames){//遍历找到的.java文件 System.out.println(name); } } /** * 列出指定目录下,后缀为.java的文件,使用方法String[] list(FilenameFilter filter)使用匿名内部类的方法 */ public static void ListFileNameFileter(){ File f = new File("E:"+File.separator+"workspace"+File.separator+"IOTest"); String[] files = f.list(new FilenameFilter() {//使用匿名内部类的方法 @Override public boolean accept(File dir, String name) { // TODO Auto-generated method stub //System.out.println("dir:"+dir+"name....."+name);//测试说明dir表示指定目录,name表示指定目录的名称 return name.endsWith(".java");//通过匿名内部类的返回值来控制指定目录下面的文件和文件夹的显示,只显示.java文件 } }); System.out.println(files.length); //遍历指定目录下面的文件和目录 for(String file:files){ System.out.println(file); } } }
/ * FileFilter接口
* 接口方法:
* boolean accept(File dir,String name) 可以使用此方法列出指定目录下面的带有某些后缀的文件。
参数:
dir - 被找到的文件所在的目录。
name - 文件的名称。
返回:
当且仅当该名称应该包含在文件列表中时返回 true;否则返回 false。
*/
代码:
需求:现在要求输入一个文件的目录,之后将里面所有的备份文件删除,备份文件都是以“.bak”或".BAK"结尾,也就是说过滤文件类型为.bak或者.BAK文件后进行删除.
第一种方法,使用FileFilter内部类的方法,进行操作:
代码:
package com.lp.ecjtu.File.filter; import java.io.File; import java.io.FileFilter; public class FileFilterDemo { public static void main(String[] args){ File dir = new File("E:\\复件 demodir"); ListFileFileter(dir); } /** * 现在要求输入一个文件的目录,之后将里面所有的备份文件删除,备份文件都是以“.bak”或".BAK"结尾,过滤文件类型为.bak文件 */ public static void ListFileFileter(File dir){ if(dir.exists()){ //匿名内部类,把FileFilter接口对象作为参数 File[] files = dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { if(pathname.isDirectory()){ return true; } String name = pathname.getName();//获取文件的名称E:\复件 demodir\Learn\sgim_piccell.v1.bin.bak System.out.println("****************"+pathname); return name.endsWith(".bak")|| name.endsWith(".BAK");//过滤文件类型为.bak或者.BAK文件,而不包含.BAK或者.bak的文件 } }); //深度遍历文件,递归 for(int i=0;i<files.length;i++){ if(files[i].isFile()){//如果遍历到的是文件,直接删除 files[i].delete(); }else{//还是目录,继续遍历,直到是文件,再删除 ListFileFileter(files[i]); } } }else{ throw new RuntimeException("操作的文件或者目录不存在!"); } } }
第二中方法实现接口,使用真实类的对象:
package com.lp.ecjtu.File.filter; import java.io.File; import java.io.FileFilter; import java.io.FilenameFilter; /** * * 需求:输入一个文件目录,之后将里面所有备份的文件删除,备份文件都是以".bak" 和".BAK"结尾 * */ public class FileterByFile implements FileFilter { @Override public boolean accept(File pathname) { if(pathname.isDirectory()){ return true; } String name = pathname.getName(); // TODO Auto-generated method stub System.out.println("****************"+pathname); return name.endsWith(".bak")|| name.endsWith(".BAK"); } }
package com.lp.ecjtu.File.filter; import java.io.File; import java.io.FileFilter; public class FileFilterDemo { public static void main(String[] args){ File dir = new File("E:\\复件 demodir"); ListFileFileterBak(dir); } /**
* 删除满足条件的文件
* @param dir
*/ public static void ListFileFileterBak(File dir){ if(dir.exists()){ File[] files = dir.listFiles(new FileterByFile());//使用过滤 for(File file:files){ if(file.isDirectory()){ ListFileFileterBak(file); }else{ file.delete(); } } }else{ throw new RuntimeException("操作的文件或者目录不存在!"); } } }
java基础知识回顾之javaIO类--File类应用:删除带内容的目录
/**
* 深度删除一个带内容的目录
* 原理:必须从里往外删除,需要深度遍历
* @author Administrator
*
*/
public class FileDeleteList { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub File dir = new File("E:\\复件 demodir"); removedir(dir); } /** * 递归的从里向外删除文件盒目录 * @param dir */ private static void removedir(File dir) { if(dir.exists()){ File[] files = dir.listFiles(); for(File file:files){ /* if(file.isDirectory()){//文件是目录继续遍历里面的目录,直到找到文件目录里面的文件 removedir(file); }else{ System.out.println(file.getAbsolutePath()+file.delete());//删除目录里面的文件 }*/ if(file.isFile()){//是否是文件,是文件的话,直接删除 System.out.println(file.getAbsolutePath()+file.delete());//删除目录里面的文件 }else{ removedir(file);//不是文件,是目录,递归的遍历,直到是文件 } } System.out.println(dir.getAbsolutePath()+dir.delete());//删除目录从里向外删除 }else{ throw new RuntimeException("删除的目录文件不存在"); } } }
java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中
/**
* File文件综合应用
* 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中。
*
* 思路:1.需要深度遍历。--递归
* 2.遍历的过程中过滤指定扩展名的文件--过滤器FileNameFilter,将文件存入容器中
* 3.将容器中的内容遍历,写入到指定文件中
*
*/
代码:
FilenameFilter 过滤器:
package com.lp.ecjtu.File.filter; import java.io.File; import java.io.FilenameFilter; public class FileterByJava implements FilenameFilter { private String SufixName;//传入过滤的名称 public FileterByJava(String SufixName){ this.SufixName = SufixName; } @Override public boolean accept(File dir, String name) { System.out.println("dir:"+dir+"_____"+"name:"+name); return name.endsWith(SufixName); } }
主程序:程序都有注释,请看程序
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.FilenameFilter; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * File文件综合应用 * 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中。 * * 思路:1.需要深度遍历。--递归 * 2.遍历的过程中过滤指定扩展名的文件--过滤器FileNameFilter,将文件存入容器中 * 3.将容器中的内容遍历,写入到指定文件中 * */ public class FileNameFileterWriteFile { /** * @param args */ public static void main(String[] args) { File dir = new File("E:\\demodir"); FilenameFilter fileter = new FileterByJava(".bak");//过滤.bak文件 List<File>fileList = new ArrayList<File>(); getFileList(dir,fileter,fileList); File desFile = new File(dir, "FileList.txt"); write2File(fileList, desFile); } /** * * @param dir 需要遍历的目录 * @param filter 过滤满足条件的文件 * @param fileList 存放符合条件的容器 */ public static void getFileList(File dir,FilenameFilter filter,List<File>fileList){ if(dir.exists()){ File[] files = dir.listFiles();//找到目录下面的所有文件 for(File file:files){ //递归 if(file.isDirectory()){ getFileList(file,filter,fileList); }else{ //对遍历的文件进行过滤,符合条件的放入List集合中 if(filter.accept(dir, file.getName())){ fileList.add(file); } } } } } /** * 将容器中的文件遍历,写入到目的文件中 * @param list 存放满足条件的文件的集合 * @param desFile 要写入的目的文件 */ public static void write2File(List<File>fileList,File desFile){ BufferedWriter bw = null; try { //使用字符流写入到目的文件中 bw = new BufferedWriter(new FileWriter(desFile)); //遍历List集合 for(File file:fileList){ bw.write(file.getAbsolutePath());//写入目的文件绝对路径 bw.newLine(); bw.flush(); } } catch (IOException e) { e.printStackTrace(); }finally{ try { if(bw != null){ bw.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
输出:在指定的目录下面创建目的文件:FileList.txt,里面存放:
E:\demodir\FileDir\Professional_32_2052.dat.bak
E:\demodir\FileDir\sgim_piccell.v1.bin.bak
E:\demodir\FileDir\sgim_picidx.v1.bin.bak