0415-File类和FileFilter接口

package demoFile;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
/*
java.io.file类是文件和目录路径名的抽象表示,主要用于文件和目录的新建、修改和删除。
静态构造方法:
    public(String pathname):通过给定的路径字符串转换为抽象路径来创建新的File实例
    public(String parent,String child):从父路径字符串和子路径字符串创建File实例
    public(File parent,String child):从抽象路径和子路径字符串创建新的File实例
2、File类的静态成员变量
    static String pathSeparator:与系统有关的路径分隔符,他表示为一个字符串
    static char pathSeparatorChar:与系统有关的路径分隔符
    static String separator:与系统有关的默认名称分隔符,他表示为一个字符
    static char separatorChar:与系统有关的默认名称分隔符。
 */
public class Demo01File {
    static int countFile = 0, countDir = 0;

    public static void main(String[] args) {
        //文件或者路径可以是有效的,也可以是无效的
        File file = new File("D:\\JAVA学习\\demo\\英语单词.txt");
        System.out.println(file.pathSeparator); //路径分隔符windows是分号;,linux是冒号:
        System.out.println(file.pathSeparatorChar);
        System.out.println(file.separator); //文件名称分隔符windows是反斜杠\,linux是正斜杠/
        System.out.println(file.separatorChar);
        getMethod();
        createFile();
        listFile(new File("D:\\新天地"));
        System.out.println("文件个数:" + countFile);
        System.out.println("目录个数:" + countDir);
        System.out.println("----------其中:pdf文件有----------");
//        listPdfFile(new File("D:\\新天地"));
//        listPdfFileInnerClass(new File("D:\\新天地"));
//        listPdfFileInnerClass2(new File("D:\\新天地"));
        listPdfFileLambda(new File("D:\\新天地"));
    }

/*
获取方法
    public String getAbsolutePath():返回此File的绝对路径名字符串。
    public String getPath():将此File转换为路径名字符串。
    public String getName():返回由此File表示的文件或目录名称。
    public long length():返回由此File表示的文件的长度。
 */
    public static void getMethod() {
//      如果File创建参数使用了绝对路径则getPath返回的也是绝对路径
        File fl = new File("JAVA学习笔记_File类和IO流.docx");
        System.out.println(fl.getAbsolutePath());//返回绝对路径 D:\JAVA学习\demo\JAVA学习笔记_File类和IO流.docx
        System.out.println(fl.getPath());//返回相对路径 JAVA学习笔记_File类和IO流.docx
        System.out.println(fl.getName());//返回文件名 JAVA学习笔记_File类和IO流.docx
        System.out.println(fl.length()); //返回文件大小字节数,无文件返回0
    }
/*
判断方法
    public Boolean exists():判断文件或目录是否存在
    public Boolean isDirectory():判断是否为目录
    public Boolean isFile():判断是否为文件
创建和删除方法
    public Boolean createNewFile():仅当具有该名称的文件不存在时,创建一个新的空文件
    public Boolean delete():删除由此File表示的目录或文件
    public Boolean mkdir():创建有此File表示的文件目录
    public Boolean mkdirs():创建有此File表示的目录,包括任何必需不存在的父目录
 */
    public static void createFile() {
        String path = (new File("")).getAbsolutePath();
        File f = new File(path, "myDir");
        if (!f.exists()) {
            f.mkdirs();
        } else {
            System.out.println("目录已存在。");
        }
        f = new File(f, "我爱你中国.txt");
        try {
            f.createNewFile();
        } catch (IOException e) {
            System.out.println(e);
        }
        f.delete();
    }
/*
    File类的遍历方法
        public String[] list() 返回一个String数组,表示该File类中所有的子文件和目录
        public File[] listFiles() 返回一个File数组,表示该File类中所有的子文件和目录
*/
    //使用递归罗列目录中存在的所有子目录和文件
    public static void listFile(File f) {
        System.out.println(f);
        File[] lf = f.listFiles();
        for (File file : lf) {
            if (file.isDirectory()) {
                countDir++;
                listFile(file);
            } else {
                System.out.println(file);
                countFile++;
            }
        }
    }

    //通过过滤器仅返回目录和pdf文档
    public static void listPdfFile(File dir) {

        File[] fl = dir.listFiles(new Demo03FileFilterImpl());
        for (File file : fl) {
            if (file.isDirectory()) {
                listPdfFile(file);
            } else {
                System.out.println(file);
            }
        }

    }

    //使用匿名内部类:通过过滤器仅返回目录和pdf文档
    public static void listPdfFileInnerClass(File dir) {
        File[] fl = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.isDirectory()
                        || pathname.toString().toLowerCase().endsWith(".pdf");
            }
        });
        for (File file : fl) {
            if (file.isDirectory()) {
                listPdfFile(file);
            } else {
                System.out.println(file);
            }
        }
    }

    //使用匿名内部类:文件过滤器的另一个接口类型FilenameFilter
    public static void listPdfFileInnerClass2(File dir) {
        File[] fl = dir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
//              参数:dir为遍历的源目录,name为里面的子目录和文件
                return new File(dir, name).isDirectory() || name.toString().toLowerCase().endsWith(".pdf");
            }
        });
        for (File file : fl) {
            if (file.isDirectory()) {
                listPdfFile(file);
            } else {
                System.out.println(file);
            }
        }

    }

    //使用lambda表达式(匿名内部类优化写法):通过过滤器仅返回目录和pdf文档
    public static void listPdfFileLambda(File dir) {
        //匿名内部类接口只有一个抽象方法的时候,就可以使用lambda表达式来简化
        File[] fl = dir.listFiles((File pathname) -> {
            return pathname.isDirectory()
                    || pathname.toString().toLowerCase().endsWith(".pdf");
        });
        for (File file : fl) {
            if (file.isDirectory()) {
                listPdfFile(file);
            } else {
                System.out.println(file);
            }
        }

    }

}

-------FileFilter接口实现类------

package demoFile;

import java.io.File;
import java.io.FileFilter;

/*
文件过滤器:在File类中有两个重载了listFiles的方法,方法参数传递就是过滤器
java.io.FileFilter接口:用于抽象路径名(File对象)的过滤器。
    作用:用来过滤文件(File对象)
    抽象方法:boolean accept(File pathname) 测试指定抽象路径名是否应该包含在某个路径名列表中。
java.io.FilenameFilter接口:实现此接口的实现类可以用于过滤文件名。
    作用:用于过虑文件名
    抽象方法:boolean accept(File dir,String name)测试指定文件是否应该包含在某一文件列表中。
注意:两个过滤器接口是没有实现类的,需要我们自己写实现类,重写过滤的方法accept,在方法中自己定义顾虑的规则。
 */
public class Demo03FileFilterImpl implements FileFilter {
    /*
    * 过滤规则:如果文件是以.pdf结尾的就返回true,否则返回false
    * 如果传入的是一个文件夹,也要返回true保证调用函数可以继续遍历
    * */
    @Override
    public boolean accept(File pathname) {
        if (pathname.isDirectory()){
            return true;
        }
        return pathname.toString().toLowerCase().endsWith(".pdf");
    }
}

 

posted @ 2020-04-17 17:35  lybingyu  阅读(191)  评论(0编辑  收藏  举报