在第一章中,有一个练习使用递归搜索文件

 1 public static void main(String[] args) {
2 File f=new File("E:\\aaa");
3 method(f);
4 }
5
6 private static void method(File f) {
7 System.out.println(f.getAbsoluteFile());
8 File[] files = f.listFiles();
9 for (File file : files) {
10 if(file.isDirectory()){
11 method(file);
12 }else{
13 if(f.getName()..toLowerCase().endWith(".java")){
14 System.out.println(file);
15 }
16 }
17 }
18 }

可以使用过滤器来查找文件。

第二章、过滤器

  1. 在File类中有两个和ListFiles重载的方法,方法的参数就是过滤器
  2. File[] listFiles(FileFilter filter):
    1. java.io.fileFilter接口:用于抽象路径名(File对象)的过滤器
      1. 作用:用来过滤文件(File对象)【接口中只有一个方法】
        1. 抽象方法:用来过滤文件的方法
          1. boolean accept(File pathname)测试指定抽象路径名是否应该包含在某个路径名列表中。

          参数:

          1. File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象
  3. File[] listFiles(FilenameFilter filter):
    1. java.io.FilenameFilter接口:实现此类的实例可以用于每一个过滤文件名。
      1. 作用:用来过滤文件名称
      2. 抽象方法:用来过滤文件的方法
        1. boolean accept(File dir,String name):测试指定文件是否应该包含在某一个文件列表中。
        2. 参数:

          1. File dir:构造方法中传递的被遍历的目录

          2. String name: 使用listFiles方法遍历目录,得到的每一个文件/文件夹的名称

  4. 注意:两个过滤器接口都是没有实现类的,需要我们自己重写实现类,重写过滤的方法accept,在方法中自己定义过滤的规则。
    1. 自定义规则为return true

       1 //1.创建FileFilter 接口的实现类,重写accept 方法,自定义过滤规则
      2 import java.io.File;
      3 import java.io.FileFilter;
      4
      5 public class FileFilterImpl implements FileFilter {
      6 @Override
      7 public boolean accept(File pathname) {
      8 return true;
      9 }
      10 }
      11
      12 public static void main(String[] args) {
      13 File f=new File("E:\\aaa");
      14 method(f);
      15 }
      16
      17 private static void method(File f) {
      18 System.out.println(f.getAbsoluteFile());
      19 File[] files = f.listFiles(new FileFilterImpl());//2.传递过滤器对象
      20 for (File file : files) {
      21 if(file.isDirectory()){
      22 method(file);
      23 }else{
      24 System.out.println(file);
      25 }
      26 }
      27 }
    2. 但是结果并没有完成过滤
  5. 需要明确FileFilter的原理以及如何使用

      

1 public class FileFilterImpl implements FileFilter {
2 @Override
3 public boolean accept(File pathname) {
4 return pathname.getName().toLowerCase().endsWith(".java");
5 }
6 }

运行结果,将文件夹也过滤掉了,文件夹里面的.java文件也一起遗漏了。改为:

 1 public class FileFilterImpl implements FileFilter {
2 @Override
3 public boolean accept(File pathname) {
4 //如果pathname是一个文件夹,返回true,继续遍历这个文件
5 if(pathname.isDirectory()){
6 return true;
7 }
8 return pathname.getName().toLowerCase().endsWith(".java");
9 }
10 }

运行结果是想要的。优化为匿名内部类:

 1 private static void method(File f) {
2 System.out.println(f.getAbsoluteFile());
3 File[] files = f.listFiles(new FileFilter() {
4 @Override
5 public boolean accept(File pathname) {
6 if(pathname.isDirectory()){
7 return true;
8 }
9 return pathname.getName().toLowerCase().endsWith(".java");
10 }
11 });
12 for (File file : files) {
13 if(file.isDirectory()){
14 method(file);
15 }else{
16 System.out.println(file);
17 }
18 }
19 }
另外一种过滤器 File[] listFiles(FilenameFilter filter) 也可以使用匿名内部类
File[] files1=f.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return new File(dir,name).isDirectory()||name.toLowerCase().endsWith(".java");
}
});
这两种接口比较特殊,都是只有一个方法,所以可以使用Lambda 表达式进一步优化
//使用Lambda 表达式
File[] files3=f.listFiles(pathname->pathname.isDirectory()||pathname.getName().toLowerCase().endsWith(".java"));
//使用Lambda表达式
File[] files2=f.listFiles((dir,name)->new File(dir,name).isDirectory()||name.toLowerCase().endsWith(".java"));

File类与常用IO流第二章过滤器的更多相关文章

  1. File类与常用IO流第一章File类

    第一章:File类 一.1个重点单词: file:文件:directory:文件夹/目录:path:路径(绝对路径:absolutePath) 二.4个静态成员变量: 1.static String ...

  2. File类与常用IO流第九章——转换流

    第九章.转换流 字节编码和字符集 编码:按照某种规则将字符以二进制存储到计算机中. 解码:将存储在计算机中的二进制数按照某种规则解析显示出来. 字符编码:Character Encoding ,就是一 ...

  3. File类与常用IO流第四章——IO字节流

    一切文件在存储时,都是以二进制数字的形式保存的,都是一个一个字节.无论使用什么样的流对象,底层传输的始终是二进制数据. 字节输出流 OutputStream java.io.OutputStream ...

  4. File类与常用IO流第七章——Properties集合

    Properties概述 java.util.Properties extends Hashtable<k,v> implements Map<k,v> Properties类 ...

  5. File类与常用IO流第三章IO流概述

    一:以内存为基准,按照数据的流动方向,流向内存为输入(读取数据),流出内存为输出.IO流有四大顶级父类: IO流四大顶级父类   输入流 输出流 字节流 字节输入流 InputStream 字节输出流 ...

  6. File类与常用IO流第八章——缓冲流

    第八章.缓冲流 缓冲流概述 缓冲流,也叫高效流,是对4个基本的FileXxx流的增强.按照数据类型分为4类:   输入缓冲流 输出缓冲流 字节缓冲流 BufferedInputStream Buffe ...

  7. File类与常用IO流第十一章——打印流

    第十一章.打印流 概述:java.io.PrintStream extends OutputStream,为其他输出流添加了功能,使题目能够方便的打印各种数据值表示形式. 特点: 只负责数据的输出,不 ...

  8. File类与常用IO流第五章——IO字符流

    字符流,只能操作文本文件,不能操作图片.视频等非文本文件 字符输入流 java.io.Reader 字符输入流中一些共性的成员方法 int read():读取单个字符并返回. int read(cha ...

  9. File类与常用IO流第六章——使用try...catch...finally处理流中的异常

    在JDK1.7之前: 1 package com.itheima.demo06.trycatch; 2 3 import java.io.FileWriter; 4 import java.io.IO ...

随机推荐

  1. TVM性能评估分析(四)

    TVM性能评估分析(四) Figure 1.  Efficient Privacy-Preserving ML Using TVM Figure 2.  Motivation: Privacy-Pre ...

  2. 如何在GPU上优化卷积

    本文将演示如何在TVM中编写高性能的卷积实现.以平方大小的输入张量和滤波器为例,并假设卷积的输入量很大.使用不同的布局来存储数据,以实现更好的数据局部性.缓冲区布局为HWCN,代表高度,宽度,通道,批 ...

  3. 开放神经网络交换(ONNX)工具

    开放神经网络交换(ONNX)工具 开放神经网络交换(ONNX)是一个开放的生态系统,它使人工智能开发人员能够在项目发展过程中选择正确的工具.ONNX为人工智能模型提供了一种开源格式,包括深度学习和传统 ...

  4. 如何使用Intel vtune profilier?

    如何使用Intel vtune profilier?

  5. ADAS处理器集成功能安全单片机MCU

    ADAS处理器集成功能安全单片机MCU ADAS processors integrate functional safety MCU 拉斯维加斯-德州仪器公司引进了ADAS和网关处理器TDA4VM和 ...

  6. Appium_adb常用命令总结

    以下为在工作学习过程中总结的常用的adb命令,用来做后续参考和查阅: 一.常用命令 显示当前运行的全部模拟器: adb devices  安装应用程序: adb install 应用程序.apk 备注 ...

  7. eclipse左边的工程列表窗口不见了解决方案

    解决eclipse左边的工程列表窗口看不到工程目录的方法: Window->Show View->Project Explorer(如果没有Project Explorer选项,则Wind ...

  8. Java @SuppressWarnings:抑制编译器警告-4

    Java 中的 @SuppressWarnings 注解指示被该注解修饰的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告,且会一直作用于该程序元素的所有子元素.例如,使用 @Supp ...

  9. 『心善渊』Selenium3.0基础 — 4、Selenium基础元素定位详解

    目录 1.什么是元素定位 2.Selenium元素定位常用API (1)By_id 定位 (2)by_name 定位 (3)by_class_name 定位 (4)by_tag_name 定位 (5) ...

  10. N沟通场效应管深度图解(1)工作原理及Multisim实例仿真

    场效应晶体管(Field Effect Transistor, FET)简称场效应管,是一种由多数载流子参与导电的半导体器件,也称为单极型晶体管,它主要分型场效应管(Junction FET, JFE ...