• Java IO---File类


    一.概述

    java.io.File类是文件和目录路径名的抽象表示形式,主要用于文件和目录的创建,查找,删除,判断等操作。

    二.构造方法

    File类常用的构造方法有以下几个:

    • public File(File parent, String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
    • public File(String pathname):通过将给定路径名字字符串转换为抽象路径名来创建一个新File实例。
    • public File(String parent, String child):根据parent路径字符串和child路径名字符串创建一个新File实例。

    使用举例:

    import java.io.File;
    
    public class TestFile {
        public static void main(String[] args) {
        
            // public File(File parent, String child):
            // 根据 parent 抽象路径名和 child 路径名字符串创建一个新 `File` 实例。
            File parent = new File("D:\\abc");
            String child = "a.txt";
            File f1 = new File(parent, child);
    
            // public File(String pathname):
            // 通过将给定路径名字字符串转换为抽象路径名来创建一个新File实例。
            String pathname = "D:\\abc\b.txt";
            File f2 = new File(pathname);
    
            // public File(String parent, String child):
            // 根据parent路径字符串和child路径名字符串创建一个新File实例。
            String p = "D:\\abc";
            String c = "c.txt";
            File f3 = new File(p, c);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    注意:

    无论指定路径下的文件或者目录是否存在,都不会影响File对象的创建。

    三. 常用方法

    1. 获取功能的方法

      • public String getAbsolutePath():返回File的绝对路径名字符串。
      • public String getPath():将File转换为一个路径名字符串。
      • public String getName():返回由此File表示的文件或目录的名称。
      • public long length():返回File表示的文件的长度。
      import java.io.File;
      
      public class TestFile {
          public static void main(String[] args) {
          
              File f = new File("D:\\abc\\test.txt");
      
              System.out.println("文件绝对路径是:" + f.getAbsolutePath());
              System.out.println("文件路径是:" + f.getPath());
              System.out.println("文件名称是:" + f.getName());
              System.out.println("文件长度是:" + f.length());
              
              System.out.println("--------------------------------");
              
              File f1 = new File("D:\\abc");
              System.out.println("目录绝对路径是:" + f1.getAbsolutePath());
              System.out.println("目录路径是:" + f1.getPath());
              System.out.println("目录名称是:" + f1.getName());
              System.out.println("目录长度是:" + f1.length());
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

      输出信息:

      $ java TestFile
      文件绝对路径是:D:\abc\test.txt
      文件路径是:D:\abc\test.txt
      文件名称是:test.txt
      文件长度是:425
      --------------------------------
      目录绝对路径是:D:\abc
      目录路径是:D:\abc
      目录名称是:abc
      目录长度是:0
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11

      注意:

      1. length()是获取文件的长度,对于目录,是没有长度概念的。

      2. 绝对路径是指从盘符开始的,一个完整的路径。

      3. 相对路径是指相对于当前目录的路径。

      4. 对于路径字符串中的分隔符,不同系统有不同的表达方式,比如windows是\,Linux是/,为了跨平台,可以使用File.separator来表示,它会根据系统使用对应的分隔符。

        比如:D:\abc, 可以使用"D:" + File.separator + "abc"

    2. 判断相关的方法

      • public boolean exists():测试File表示的文件或目录是否存在
      • public boolean isDirectory():测试File表示的文件是否是一个目录
      • public boolean isFile():测试File表示的文件是否是一个标准文件
      import java.io.File;
      
      public class TestFile {
          public static void main(String[] args) {
          
              File f = new File("D:\\abc\\test.txt");
              File f1 = new File("D:\\abc");
      
              // 判断是否存在
              System.out.println("D:\\abc\\test.txt是否存在? ==> " + f.exists());
              System.out.println("D:\\abc是否存在? ==> " + f1.exists());
      
              // 判断是否是文件
              System.out.println("D:\\abc\\test.txt是文件? ==> " + f.isFile());
              System.out.println("D:\\abc是文件? ==> " + f1.isFile());
      
              // 判断是否是目录
              System.out.println("D:\\abc\\test.txt是目录? ==> " + f.isDirectory());
              System.out.println("D:\\abc是目录? ==> " + f1.isDirectory());
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

      输出信息:

      $ java TestFile
      D:\abc\test.txt是否存在? ==> true
      D:\abc是否存在? ==> true
      D:\abc\test.txt是文件? ==> true
      D:\abc是文件? ==> false
      D:\abc\test.txt是目录? ==> false
      D:\abc是目录? ==> true
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    3. 新建和删除功能

      • public boolean createNewFile():当且仅当不存在File指定名称的文件时,创建一个新的空文件。
      • public boolean delete():删除此File表示的文件或目录。
      • public boolean mkdir():创建此File指定的目录。
      • public boolean mkdirs():创建此File指定的目录,包括所有必需但不存在的父目录。
      import java.io.File;
      import java.io.IOException;
      
      public class TestFile {
          public static void main(String[] args) throws IOException{
              // 创建文件
              File newFile = new File("newFile.txt");
              System.out.println("newFile.txt存在? ==> " + newFile.exists());
              System.out.println("创建newFile.txt是否成功? ==> " + newFile.createNewFile());
              System.out.println("newFile.txt存在? ==> " + newFile.exists());
              System.out.println("=====================\r\n");
      
              // 创建单级目录
              File newDir = new File("newDir");
              System.out.println("newDir存在? ==> " + newDir.exists());
              System.out.println("创建newDir是否成功? ==> " + newDir.mkdir());
              System.out.println("newDir存在? ==> " + newDir.exists());
              System.out.println("=====================\r\n");
      
              // 创建多级目录
              File newDirs = new File("newDirs\\aaa");
              System.out.println("newDirs\\aaa存在? ==> " + newDirs.exists());
              System.out.println("创建newDirs\\aaa是否成功? ==> " + newDirs.mkdirs());
              System.out.println("newDirs\\aaa存在? ==> " + newDirs.exists());
      
              // 删除文件
              System.out.println("删除文件: " + newFile.delete());
      
              // 删除目录
              System.out.println("删除目录: " + newDir.delete());
              System.out.println("删除不为空的目录: " + newDirs.delete());
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33

      输出信息:

      $ java TestFile
      newFile.txt存在? ==> false
      创建newFile.txt是否成功? ==> true
      newFile.txt存在? ==> true
      =====================
      
      newDir存在? ==> false
      创建newDir是否成功? ==> true
      newDir存在? ==> true
      =====================
      
      newDirs\aaa存在? ==> true
      创建newDirs\aaa是否成功? ==> false
      newDirs\aaa存在? ==> true
      删除文件: true
      删除目录: true
      删除不为空的目录: true
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17

      注意:

      1. 删除多级目录时候,不会整个目录级删除,只会删除最内层的非空目录。
      2. 目录非空时,无法被删除。
    4. 遍历目录方法

      • public String[] list():返回一个String数组,数组元素表示该File目录中所有子文件或目录名字

      • public File[] listFiles():返回一个File数组,数组元素表示该目录总所有的子文件或目录

      比如当前目录下有一文件夹Dir,里面有文件a.txt,b.txt,d.txt,以及文件夹c

      import java.io.File;
      import java.io.IOException;
      
      public class TestFile {
          public static void main(String[] args) throws IOException{
              // 当前路径下的Dir目录
              File f = new File("Dir");
      
              // public String[] list()
              String[] names;
              names = f.list();
      
              // 遍历files
              for (String name : names) {
                  System.out.println(name);
              }
          }
      }
      // 输出信息
      a.txt
      b.txt
      c
      d.txt
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      import java.io.File;
      import java.io.IOException;
      
      public class TestFile {
          public static void main(String[] args) throws IOException{
              // 当前路径下的Dir目录
              File dir = new File("Dir");
      
              // public File[] listFiles()
              File[] files;
              files = dir.listFiles();
      
              for (File f : files) {
                  System.out.println(f.getName());
              }
          }
      }
      // 输出信息
      a.txt
      b.txt
      c
      d.txt
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22

      注意:

      ​ 使用listFiles方法的File对象,其所表示的目录必须是实际存在的,否则无法遍历,报NullPointerException异常。

    5. 带过滤器的遍历目录方法

      • File[] listFiles(FileFilter filter):返回抽象路径名数组,这些路径名表示此File表示的目录中满足指定过滤器的文件和目录。

      说明:

      java.io.FileFilter是一个接口,是File的过滤器,该接口的对象可以传递给File类的listFiles(FileFilter)作为参数。

      ​ 接口中只有一个方法:boolean accept(File pathname):测试指定pathname是否应该包含在当前File目录中,符合就返回true。

      ​ 通过过滤器的作用,listFiles()返回的数组元素中,子文件对象都是符合过滤条件的。

      举例:查找目录Dir下,以.java结尾的文件,打印文件名字

      目录如下图:

      在这里插入图片描述

      import java.io.*;
      
      public class TestFileFilter {
          public static void main(String[] args) {
              File dirs = new File("Dir");
      
              File[] files = dirs.listFiles(new FileFilter() {
                  public boolean accept(File pathname) {
                      return pathname.getName().endsWith(".java");
                  }
              });
      
              // 打印文件名字
              for (File f : files) {
                  System.out.println(f.getName());
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18

      输出:

      $ java TestFileFilter
      Consumer.java
      Ticket.java
      
      • 1
      • 2
      • 3

      通过之前所学Lambda,发现上面的FileFilter接口满足只有一个接口的条件,可以使用Lambda优化,如下为优化代码:

      import java.io.*;
      
      public class TestFileFilter {
          public static void main(String[] args) {
              File dirs = new File("Dir");
      
              // File[] files = dirs.listFiles(new FileFilter() {
              //     public boolean accept(File pathname) {
              //         return pathname.getName().endsWith(".java");
              //     }
              // });
      
              // 使用Lambda优化
              File[] files = dirs.listFiles(pathname -> pathname.getName().endsWith("java"));
      
              // 打印文件名字
              for (File f : files) {
                  System.out.println(f.getName());
              }
          }
      }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21

    四. 综合例子

    实现文件搜索:搜索指定目录下的.java文件

    分析:

    1. 目录搜索,无法判断多少级目录,需要使用递归遍历所有目录。
    2. 遍历目录时,获取到的子文件,通过文件名字判断是否满足条件
    import java.io.File;
    
    public class FileDemo {
        public static void main(String[] args) {
            File dir = new File("Dir");
            search(dir);
        }
    
        public static void search(File dirs) {
    
            File[] files = dirs.listFiles(p -> p.getName().endsWith(".java") || p.isDirectory());
    
            // 循环打印
            for (File f : files) {
                // 如果是文件,则打印
                if (f.isFile()) {
                    System.out.println(f.getName());
                }
                else {  // 是目录,则递归查找
                    search(f);
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
  • 相关阅读:
    力扣345-反转字符串中的元音字母——双指针法
    C/C++输入输出流函数大全
    数据库性能优化(查询优化、索引优化、负载均衡、硬件升级等方面)
    React报错之React Hook 'useEffect' is called in function
    element-plus打开Dialog、图片预览导致页面抖动
    docker安装php7.4安装(swoole)
    Servlet 综合案例:表白墙
    js控制全屏和取消全屏
    经典算法——直接选择排序
    【小工具】一个功能适合的文本编辑器
  • 原文地址:https://blog.csdn.net/chisuisi5702/article/details/126284545