File类的正确学习方式(一)-文件查找

本文主要介绍了Java中的File类,包括概念、静态方法、构造方法及常用的三大方法。重点讲解了如何遍历目录、实现递归以及优化文件查找,特别是通过递归和字符串尾缀匹配搜索.java文件的方法。

关键字:File类的创建、删除;获取文件名、路径、大小;目录遍历、文件查找

一、File类入门

1.概念

2.提供的静态方法(了解)

  • C:\develop\a.txt windows 反斜杠
  • User/develop/a.txt linux 正斜杆
    类名.静态成员
static String pathSeparator与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
static char pathSeparatorChar与系统有关的路径分隔符。
static String separator与系统有关的默认名称分隔符,为了方便,它被表示为一个字符
static char separatorChar与系统有关的默认名称分隔符。
package file;
import java.io.File;
/**
 * File的静态成员变量
 * 功能:关于文件路径和文件名称的分隔符使用
 */
public class Demo01File {
    /**
     * 注意:操作路径不能写死了
     * C:\develop\a.txt     windows  反斜杠
     * User/develop/a.txt   linux 正斜杆
     * 正确写法:"C:" + File.separator + "develop" +File.separator+ "a.txt" ;
     */
    public static void main(String[] args) {
        String pathSeparator = File.pathSeparator;    //路径分隔符  win是 分号;
        System.out.println(pathSeparator);          // linux 为 冒号:

        String separator = File.separator;          //文件名称分隔符   win:反斜杠 \
        System.out.println(separator);              //linux :正斜杠 /
    }
}

3.构造方法

4 中创建 File 对象的方法;

  • File(String pathname);
  • File(String parent,String child);
  • File(File parent , String child);
  • File(URI uri);
public class Demo02FileStructure {

    public static void main(String[] args) {
        String pathname = "/Users/IdeaProjects/JavaDemo/a.txt";   //传递文件夹、或者文件全称
        File file = new File(pathname);
        System.out.println(file);

        File a = new File("a.txt");   //  传递文件名!!!不要带斜杆
        System.out.println(a);
    }
}

4.常用的三大方法(重点)

一、获取功能

  •   获取绝对路径:file.getAbsolutePath()
    
  •   获取路径:file.getPath() 构造函数中的路径值
    
  •   获取文件名:file.getName()
    
  •   获取文件大小:file.length() 单位:字节
    

二、判断功能:

  •   file 文件/夹是否存在:file.exists()
    
  •   构造函数路径是尾部是文件吗:file.isFile()
    
  •   file.isDirectory()
    

三、创建、删除功能

  •   创建新文件:file.createNewFile()
    
  •   创建单级目录:file.mkdir()
    
  •   创建多级目录:file.mkdirs()  一般使用这个,兼容单级。
    
  •   删除文件/空文件夹:file.delete()   直接从磁盘删除,不走回收站
    
package file;
import java.io.File;
import java.io.IOException;

/*
* File 三大类常用的方法:File file = new File("文件名/文件夹"
* time:2020-05-07
* */

public class Demo03FileMethod {

    public static void main(String[] args) throws IOException {
        //获取文件:路径、名称、大小的4种方法
        //show1();

        //判断的方法:File是否存在、是否为文件或者目录
        //show2();

        //创建、删除:文件、目录功能
         show3();
    }

    /*
     * 种类3:创建和删除功能
     * */
    private static void show3() throws IOException {
        //此file只是文件或者路径的 抽象表现形式,此时是不存在的。
        File file = new File("/Users/IdeaProjects/JavaDemo/b.txt");

        //1.  createNewFile():
        // 创建文件
        boolean newFile = file.createNewFile();  //抛出异常
        System.out.println("绝对路径文件创建:" + newFile);
        boolean c = new File("c.txt").createNewFile();    // 注意此时,只需要传递文件名即可。不用加斜杠
        System.out.println("相对路径文件创建:"+ c);

        //2.创建文件夹:
        // mkdir() 创建单级文件夹
        // mkdird() 创建多级文件夹
        File f1 = new File("/Users/IdeaProjects/JavaDemo/新建文件夹");
        System.out.println(f1.mkdir());
        boolean mkdirs = new File("/Users/IdeaProjects/JavaDemo/新建文件夹/aaa/bbb").mkdirs();
        System.out.println(mkdirs);

        //3. file.delete()
        // 删除空文件夹,或者文件
        File f2 = new File("/Users/IdeaProjects/JavaDemo/新建文件夹/ccc");
        System.out.println("删除新建文件夹下的CCC文件夹:"+f2.delete());
        //删除已存在的文件
        File d = new File("c.txt");
        System.out.println("删除d.txt:"+d.delete());
	}

    /*
     * 种类2:判断功能的方法
     * */
    private static void show2() {
        File file = new File("/Users/IdeaProjects/JavaDemo/a.txt");

        //1.  exists()
        boolean b = file.exists();
        System.out.println("文件或者目录是否真实存在:" + b);

        //2. isFile()
        boolean isfile = file.isFile();   //判断此 File是否为文件,即 new File()中传递的路径 结尾是否是文件名
        System.out.println(isfile);

        //3.isDirectory
        System.out.println(file.isDirectory());   //判断是此File是否为文件夹,即判断构造方法中给定的路径,结尾处是否是文件夹
    }

    /*
    * 种类1:获取方法
    * */
    private static void show1() {
        //创建文件或目录抽象对象,重写了toString方法
        File file = new File("/Users/IdeaProjects/JavaDemo/a.txt");
        System.out.println(file);  //toString()方法,调用的就是getPath()方法

        //1.getAbsolutePath() 获取绝对路径:
        System.out.println(file.getAbsolutePath());//   /Users/IdeaProjects/JavaDemo/a.txt

        //2.getPath() :获取路径
        System.out.println(file.getPath());  //  和new File()时传递的路径有关系

        //3.getName() :获取的是构造方法传递路径的结尾部分,即最后一级文件夹或者文件名
        String name = file.getName();
        System.out.println(name);    //JavaDemo或者a.txt

        //4. length() :获取文件大小(单位:字节)
        long length = file.length();  //588 byte
        System.out.println(length);   //无法获取 文件夹(文件夹没有大小之分) 以及 不存在的的文件的大小

    }
}

二、遍历目录、递归、文件查找

1.遍历目录

File类提供的遍历下一级目录Directory的方法:

  • (1)public String[]list(); 返回String数组,表示File目录中的下一级的所有文件和目录名
  • (2) public File[] listFiles(); 返回File数组,表示File下级目录中的所有文件和文件夹的 new File() 抽象对象表示形式
public class Demo04FileDirectoryEach {
    public static void main(String[] args) throws IOException {

        //创建文件和文件夹
        new File("/Users/IdeaProjects/JavaDemo/test/ccc/ddd").mkdirs();
        new File("/Users/IdeaProjects/JavaDemo/test/ccc/eee").mkdirs();
        new File("/Users/IdeaProjects/JavaDemo/test/ccc/a.txt").createNewFile();

        //遍历目录1:  file.list()
        File file = new File("/Users/IdeaProjects/JavaDemo/test/ccc");
        String[] list = file.list();
        for (String s : list) {
            System.out.println(s);
                //打印目录下子内容名称
        }

        //遍历目录2:  file.listFiles()
        File[] files = file.listFiles();
        for (File file1 : files) {
            System.out.println(file1);
                    /* 打印该目录下的子内容,以File的重写的toString()
        }
    }
}

想要遍历某文件夹下的各级子内容,得使用递归思想+上述方法!

3.递归思想

递归思想:递归计算 n+…+1 之和

  • 1.中止条件
  • 2.递归目的:获取下一个数字
public class Demo01Recurison {
    public static void main(String[] args) {

        int sum = sum(100);
        System.out.println(sum);
    }

    private static int sum(int n) {
        //System.out.println(n);
        if (n == 1)
            return 1;  //1.中止条件

        //2.递归的目的:获取下一个被加的  数字(n-1)
        return  n + sum(n-1);
    }
}

3.利用递归对文件遍历和搜索🔍

  • 功能:搜索本项目下的所有 .java文件:递归和字符串尾缀匹配的方法来找 .java 文件
public class Demo02DirectoryRecurison {
    //递归打印 多级目录
    //同时也可以递归搜索 特定文件
    public static void main(String[] args) {
        File dir = new File("/Users/IdeaProjects/JavaDemo");
        getAllFiles(dir);
    }

    private static void getAllFiles(File dir) {
       // System.out.println(dir);       //打印所有文件夹
        File[] files = dir.listFiles();   //用到listFiles()方法,查看下一级内容
        for (File f : files) {
            if (f.isDirectory()){       //判断是否为文件夹,是则递归查看
                getAllFiles(f);
            }else {
                //System.out.println(f);    //打印所有文件名
             /*
                //法一:搜索 .java结尾的文件
                String name = f.getName();
                int i = name.lastIndexOf(".");
                String substring = name.substring(i + 1);
                if (substring.equals("java")){
                    System.out.println(f);
                }*/

                //法二:搜索  .java文件
                // 还有  name.endsWith(".java")  方法来判断尾缀。
                if (f.getName().toLowerCase().endsWith(".java")){
                    System.out.println(f);  //兼容大小写,
                }
            }
        }

    }
}

4.优化文件搜索🔍

  • 优化1:上面的 dir.listFiles() 将文件夹下的所有内容均存储到了 File[] 数组中,造成了栈空间的浪费。 这里采用File类中listFiles()的两种重载方法,来进行文件过滤。满足过滤器的存入File数组
    listFiles(FileFilter filter)
    listFiles(FilenameFilter filter)
public class Demo03FileSearch {
    //1.上面用递归和字符串尾缀匹配的方法来找 .java 文件
    //2. 这里采用File类中listFiles()的两种重载方法,来进行文件过滤。
    //3.listFiles(FileFilter filter)    listFiles(FilenameFilter filter)
    //4.FileFilter是一个接口,只有accept一个抽象方法,因为可使用lambda表达式优化匿名内部类

    public static void main(String[] args) {
        File dir = new File("/Users/IdeaProjects/JavaDemo");
        getAllFiles(dir);
    }

    private static void getAllFiles(File dir) {
        // System.out.println(dir);       //打印所有文件夹
        //用到listFiles()方法,查看下一级内容
        //这里使用带有过滤器的listFiles(filter)方法,符合过滤器规则的,返回true,则保存到File[]数组中

        File[] files = dir.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if (pathname.getName().toLowerCase().endsWith(".java") || pathname.isDirectory()){
                    return true;
                }
                return false;
            }
        });
        
        for (File f : files) {
            if (f.isDirectory()){       //判断是否为文件夹,是则递归查看
                getAllFiles(f);
            }else {
                //搜索  .java文件
                if (f.getName().toLowerCase().endsWith(".java")){
                    System.out.println(f);  //兼容大小写,
                }
            }
        }

    }
}

优化2:使用lambda表达式优化匿名内部类(接口只有一个抽象函数的情况下) :

()->{} 只保留参数和方法体
        File[] files = dir.listFiles((pathname)->{
            return pathname.getName().toLowerCase().endsWith(".java") || pathname.isDirectory();
        });
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值