javaIO类的File类应用:过滤器接口

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。

代码:

  • 需求找出某个路径下面以.java结尾的文件。

实现:FilenameFilter 接口

import java.io.File;
import java.io.FilenameFilter; public class FileterByJava implements FilenameFilter { private String caiName;//传入过滤的名称
public FileterByJava(String caiName){
this.caiName = caiName;
} @Override
public boolean accept(File dir, String name) {
System.out.println("dir"+dir+"_____"+"name"+name);//返回dir:D:\cai\Test_____name:a.txt
} }
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("D:"+File.separator+"cai"+File.separator+"Test");
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("D:"+File.separator+"cai"+File.separator+"Test");
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内部类的方法,进行操作:

代码:

import java.io.File;
import java.io.FileFilter; public class CaiNiao { public static void main(String[] args){
File dir = new File("D:\\caidir");
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();//获取文件的名称D:\caidir\a.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("操作的文件或者目录不存在!");
}
}
}
/*
第二中方法实现接口,使用真实类的对象:
*/ 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");
} }
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学习:File类中的过滤器接口的更多相关文章

  1. JAVA实现File类中的遍历操作并输出内容

    package shb.java.testIo; import java.io.BufferedReader; import java.io.BufferedWriter; import java.i ...

  2. “全栈2019”Java第七十九章:类中可以嵌套接口吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. Java分享笔记:File类中常用方法的介绍

    java.io包下的File类用于描述和创建一个文件或文件夹对象,只能对文件或文件夹做一些简单操作,不能修改文件的内容,功能比较有限.下面是对于File类中常用方法的程序演示. [1] 演示程序一 p ...

  4. Java文件File类学习总结

    java.io.File类 代表文件和目录,在开发中,读取文件.生成文件.删除文件.修改文件的属性都会用到该类. 常见构造方法: public File(String pathName){} 以pat ...

  5. Java中 IO类 - File类中的判断功能

    package com.hxzy.IOSer;import java.io.*;public class Demo05 { public static void main(String[] args) ...

  6. Java之File类

    一.初见File类 java.io.File类代表系统中的文件(文件或目录) 常用构造方法 File(String pathname) File(String parent, String child ...

  7. 33.JAVA编程思想——JAVA IO File类

    33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...

  8. Java学习-023-Properties 类 XML 配置文件读取及写入源代码

    之前的几篇 Properties 文章已经讲述过了 Java 配置文件类 Properties 的基本用法,查看 JDK 的帮助文档时,也可看到在 Properties 类中还有两个方法 loadFr ...

  9. java.io.File类

    java.io.File类 1.凡是与输入.输出相关的类.接口等都定义在java.io包下 2.File是一个类.能够有构造器创建其对象.此对象相应着一个文件(.txt .avi .doc .ppt ...

随机推荐

  1. iOS开发之--隐藏状态栏

    1,全局隐藏 在Targets->General->勾选中Hide status bar .,如下图: 2.单个页面隐藏/展示状态栏 1).首先在info.plist里面View cont ...

  2. libtool编译

    1.充分利用共享库的能力.libtool 是一个通用库支持脚本 2.我们可以认为libtool是gcc的一个抽象,也就是说,它包装了gcc或者其他的任何编译器,用户无需知道细节,只要告诉libtool ...

  3. ca动画

    //动画上下文-(void)animationOfUIKit{    UIView *redView=[[UIView alloc]initWithFrame:CGRectMake(10, 10, 1 ...

  4. HeadFirst设计模式--命令模式

    模式定义 命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化:对请求排队或者记录请求日志,以及支持可撤销的操作.命令模式是一种对象行为型模式 ...

  5. odoo10学习笔记六:工作流、安全机制、向导

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189289.html 一:工作流 工作流是与业务流程相关联的模型,可用于跟踪工序的动态演变过程. 工作流. ...

  6. springcloud学习之路: (四) springcloud集成Hystrix服务保护

    Hystrix是一套完善的服务保护组件, 可以实现服务降级, 服务熔断, 服务隔离等保护措施 使用它可以合理的应对高并发的情况 做到保护服务的效果 1. 导入依赖 <dependency> ...

  7. Linux内存管理(最透彻的一篇)【转】

    转自:https://www.cnblogs.com/ralap7/p/9184773.html 摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物 ...

  8. appium---app输入中文

    在app自动化的过程中,都会遇到输入中文的问题,今天总结下app自动化如何输入中文 app输入中文 在启动app的时候在参数里面添加unicodeKeyboard和resetKeyboard后,运行代 ...

  9. paxos算法—今生

    Paxos 定义2.1  票:即弱化形式的锁.它具备下面几个性质: 可重新发布:服务器可以重新发布新票,即使前面发布的票没有释放. 票可以过期:客户端用一张票来给服务器发送命令请求时,只有当这张票是最 ...

  10. c# 第15节 StringBuilder

    本节内容: 1:StringBuilder 2:内容总结 1:StringBuilder 实例: 2:内容总结 项目: