【转】File类应用 - FilenameFilter 和 FileFilter
FilenameFilter & FileFilter
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的好.
public File[] listFiles(FileFilter filter)
返回抽象路径名数组,这些路径名表示此抽象路径名表示的目录中满足指定过滤器的文件和目录。除了返回数组中的路径名必须满足过滤器外,此方法的行为与 listFiles() 方法相同。如果给定 filter 为 null,则接受所有路径名。否则,当且仅当在路径名上调用过滤器的 FileFilter.accept(java.io.File) 方法返回 true 时,该路径名才满足过滤器。
/**
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) 可以使用此方法列出指定目录下面的带有某些后缀的文件。
参数:
dir - 被找到的文件所在的目录。
返回:
当且仅当该名称应该包含在文件列表中时返回 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("操作的文件或者目录不存在!");
- }
- }
- }
【转】File类应用 - FilenameFilter 和 FileFilter的更多相关文章
- java基础知识回顾之javaIO类--File类应用:过滤器接口FilenameFilter和FileFilter
FilenameFilter和FileFilter都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码:通过使用File类中String[] list(FilenameFi ...
- [原创]Java中使用File类的list方法获取一定数量的文件:FilenameFilter接口的特殊用法
前言:有时候我们可能会遇到这样一个问题:需要遍历一个包含极多文件的文件夹,首先想到的肯定是使用File.list()方法,该方法返回一个String[],但是如果文件达到几亿呢?这个时候我们就需要分批 ...
- Java基础知识强化之IO流笔记10:File类输出指定目录下指定后缀名的文件名称案例(File类的文件过滤器方法改进list( FilenameFilter ff))
1. 案例: 判断F盘下是否有后缀名为.jpg的文件,如果有的话,就输出这个文件名. 2. 案例代码如下: (1)思路是:先获取所有的文件和文件夹封装的对象,然后遍历的时候,依次判断,如果满足条件就输 ...
- I/O流——File类及使用
I/O框架介绍 I/O是计算机输入/输出的接口.Java的核心库java.io提供了全方面的I/O接口,包括:文件系统的操作,文件读写,标准设备的输出等. File类及使用 ① 一个File类的对 ...
- Java File类总结和FileUtils类
Java File类总结和FileUtils类 文件存在和类型判断 创建出File类的对象并不代表该路径下有此文件或目录. 用public boolean exists()可以判断文件是否存在. Fi ...
- File类
存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动,传送,亦可以被其他程序使用.由于数据存储在文 ...
- 黑马程序员——【Java基础】——File类、Properties集合、IO包中的其他类
---------- android培训.java培训.期待与您交流! ---------- 一.File类 (一)概述 1.File类:文件和目录路径名的抽象表现形式 2.作用: (1)用来将文件或 ...
- 第二十天File类、字节流
File类.字节流 File类 File类介绍 File:它是描述持久设备上的文件或文件夹的.只要是在Java程序中操作文件或文件夹肯定需要使用File类完成. File类构造方法 /* * File ...
- 详谈JAVA中的file类与IO流
File类 位置于java.io包构造方法:File(String parent, String child)new file("d:\\","a.txt") ...
随机推荐
- linux网卡混杂模式
混杂模式就是接收所有经过网卡的数据包,包括不是发给本机的包,即不验证MAC地址.普通模式下网卡只接收发给本机的包(包括广播包)传递给上层程序,其它的包一律丢弃.一般来说,混杂模式不会影响网卡的正常工作 ...
- PHPStorm技巧篇 -- 全局搜索
自定义快捷键,找到search everywhere 我绑定的是alt+N 设置好并apply后,在项目中使用:快捷键alt+N ,输入自己需要查找的文件或类名或方法名,即可出现相应的选项. so c ...
- 使用Spring Tool Suite创建Maven Web工程
使用STS或者Eclipse这样的IDE创建Maven Web工程还真不是一般的麻烦! 看了网上不少的方法介绍,操作下来总有区别,不是这里不对就是那里不对. 下面是尝试了几次之后成功的方法,记录一下. ...
- lua特性纪要
[局部变量] lua的局部变量通过local进行显示声明, 其作用域仅限于声明它的块block.这里的block分为三种类型: 1.控制结构的执行体 2.函数的执行体 3.chunk 比较容易引起混淆 ...
- MySQL数据库常用命令
1.连接mysql数据库:mysql -u用户名 -p密码; 2.创建数据库:create database 数据库名称; 3.删除数据库:drop database 数据库名称; 4.使用数据库:u ...
- ubuntu16.04安装jdk,tomcat
ubuntu16.04安装jdk,tomcat 最近装了一下tomcat,网上的教程很多,我也试了很多次,但是有一些教程关于tomcat配置是错误的,让我走上了歧途.差点重装系统,还好王总及时出手帮助 ...
- 张艾迪(创始人):Be.Time+Cr.Idear的创新理念
The World No.1 Girl :Eidyzhang The World No.1 Internet Girl :Eidyzhang AOOOiA.global Founder :Eidyzh ...
- SQL Server Management Studio 已停止工作 异常错误
找到类似环境下sql的路径 D:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\ 复制出 Ss ...
- border家族
border-style:dotted solid double dashed(上边框是点状,右边框是实线,下边框是双线,左边框是虚线)边框样式;border-width(边框宽度);border-r ...
- <context:component-scan>使用说明
Spring组件扫描<context:component-scan/>使用详解 在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的java文件,如果扫 ...