Java中的File类常见操作详解

File类

java.io.File

  • File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)

  • 并没有直接提供移动/复制文件的方法,需要自己手动编写或者直接使用Files 文件工具类

  • File不能访问文件数据

  • 实现了比较器-Comparable接口和Comparator接口和序列化的接口
    在这里插入图片描述

File类属性

  • 属性名

    • File.separator:根据当前系统返回一个路径的分隔符
  • 示例代码

    System.out.println(File.separator);// \
    

File类常用方法

  • 列举了45个左右的方法

创建操作

  • 方法名

    1. boolean createNewFile():当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。

      • 返回的是创建是否成功。临时文件已存在返回则创建失败,返回false。不存在则创建成功返回true

      • 注意:最后一级目录是临时文件的名称
        在这里插入图片描述

    2. static File createTempFile(String prefix, String suffix):在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。

      • 默认路径:C:\Users\用户名\AppData\Local\Temp

      • 注意:前缀名称的长度必须大于3;如果后缀为null,默认为.tmp

      • 创建效果
        在这里插入图片描述

    3. static File createTempFile(String prefix, String suffix, File directory):在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。

      • 创建效果
        在这里插入图片描述
    4. boolean mkdir():创建由此抽象路径名命名的目录。

      • 只能创建一级目录,如果传入的是多级目录,则会创建失败;

      • 如果目录已存在,也会返回false

    5. boolean mkdirs():创建由此抽象路径名命名的目录

      • 多层目录会级联创建;不会覆盖原有的目录

      • 创建效果
        在这里插入图片描述

  • 示例代码

    // 创建操作
    {
      File file1 = new File("./file/这是文件名");
      
      // boolean createNewFile():当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。【最后一级目录是临时文件的名称】
      try {
        boolean newFile = file1.createNewFile();
        //创建临时文件是否成功:true
        System.out.println("创建临时文件是否成功:" + newFile);
      } catch (IOException e) {
        e.printStackTrace();
      }
      
      // static File createTempFile(String prefix, String suffix):在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。
      try {
        File tempFile = File.createTempFile("这是前缀", ".后缀");
        //C:\Users\Administrator\AppData\Local\Temp\这是前缀6145411571022854136.后缀
        System.out.println(tempFile);
      } catch (IOException e) {
        e.printStackTrace();
      }
      
      // static File createTempFile(String prefix, String suffix, File directory):在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
      File file3 = new File("./file/temp");//指定存放临时文件的地址
      try {
        File temp = File.createTempFile("临时文件名的前缀", ".temp", file3);
        //  .\file\temp\临时文件名的前缀2536301214503247272.temp
        System.out.println(temp);
      } catch (IOException e) {
        e.printStackTrace();
      }
      
      // boolean mkdir():创建由此抽象路径名命名的目录。
      File file4 = new File("./file/a");
      boolean mkdir = file4.mkdir();
      //创建一层目录的结果:true
      System.out.println("创建一层目录的结果:" + mkdir);
      
      // boolean mkdirs():创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。
      File file5 = new File("./file/a/b/c/d/e/f");
      boolean mkdirs = file5.mkdirs();
      //创建多层目录的结果:true
      System.out.println("创建多层目录的结果:" + mkdirs);
    }
    

删除操作

  • 方法名

    1. boolean delete():删除由此抽象路径名表示的文件或目录。

      • 如果此路径名表示目录,则目录必须为空才能删除。

      • 删除后不进入回收站

    2. void deleteOnExit():请求在虚拟机终止时删除由此抽象路径名表示的文件或目录。

  • 示例代码

    // 删除操作
    {
      // boolean delete():删除由此抽象路径名表示的文件或目录。
      File file1 = new File("./file/a.txt");
      boolean delete = file1.delete();
      System.out.println("删除结果:" + delete);
      
      // void deleteOnExit():请求在虚拟机终止时删除由此抽象路径名表示的文件或目录。
      File file2 = new File("./file/b.txt");
      file2.deleteOnExit();
    }
    

更新操作

  • 方法名

    1. boolean renameTo(File dest):重命名由此抽象路径名表示的文件。

      • 如果新的File对象指定的是新路径,那么相当于对文件进行移动。路径不存在则失败,不加路径默认到项目根目录。
    2. boolean setExecutable(boolean executable):为此抽象路径名设置所有者的执行权限的便利方法。

    3. boolean setExecutable(boolean executable, boolean ownerOnly):设置该抽象路径名的所有者或每个人的执行权限。

    4. boolean setLastModified(long time):设置由此抽象路径名命名的文件或目录的最后修改时间。

    5. boolean setReadable(boolean readable):一种方便的方法来设置所有者对此抽象路径名的读取权限。

    6. boolean setReadable(boolean readable, boolean ownerOnly):设置此抽象路径名的所有者或每个人的读取权限。

    7. boolean setReadOnly():标记由此抽象路径名命名的文件或目录,以便只允许读取操作。

    8. boolean setWritable(boolean writable):一种方便的方法来设置所有者对此抽象路径名的写入权限。

      • 相当于控制是否只读
    9. boolean setWritable(boolean writable, boolean ownerOnly):设置此抽象路径名的所有者或每个人的写入权限。

  • 示例代码

    // 更新操作
    {
      // boolean renameTo(File dest):重命名由此抽象路径名表示的文件。
      File file1 = new File("./file/aaa.txt");
      File fileByRename = new File("./file/temp/bbb.txt");
      boolean b1 = file1.renameTo(fileByRename);
      System.out.println("重命名文件结果:" + b1);
      
      // boolean setLastModified(long time):设置由此抽象路径名命名的文件或目录的最后修改时间。
      File file2 = new File("./file/time.txt");
      LocalDateTime dateTime = LocalDateTime.of(1990, 1, 1, 6, 6);
      long l = dateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
      
      boolean b2 = file2.setLastModified(l);
      System.out.println("更新文件最后一次修改时间为:" + dateTime + ",是否成功:" + b2);
      
      // boolean setExecutable(boolean executable):为此抽象路径名设置所有者的执行权限的便利方法。
      boolean b3 = file2.setExecutable(true);
      System.out.println("1-setExecutable():" + b3);//1-setExecutable():true
      
      // boolean setExecutable(boolean executable, boolean ownerOnly):设置该抽象路径名的所有者或每个人的执行权限。
      boolean b4 = file2.setExecutable(true, true);
      System.out.println("2-setExecutable():" + b4);//2-setExecutable():true
      
      // boolean setReadable(boolean readable):一种方便的方法来设置所有者对此抽象路径名的读取权限。
      
      // boolean setReadable(boolean readable, boolean ownerOnly):设置此抽象路径名的所有者或每个人的读取权限。
      
      // boolean setReadOnly():标记由此抽象路径名命名的文件或目录,以便只允许读取操作。
      boolean b5 = file2.setReadOnly();
      System.out.println("设置文件只读:" + b5);//设置文件只读:true
      
      // boolean setWritable(boolean writable):一种方便的方法来设置所有者对此抽象路径名的写入权限。
      File file3 = new File("./file/write.txt");
      boolean b6 = file3.setWritable(false);
      System.out.println("设置写入权限操作结果:" + b6);
      
      // boolean setWritable(boolean writable, boolean ownerOnly):设置此抽象路径名的所有者或每个人的写入权限。
    }
    

获取文件信息操作

  • 方法名

    1. long lastModified():返回此抽象路径名表示的文件上次修改的时间。

    2. long length():返回由此抽象路径名表示的文件的长度。

    3. Path toPath():返回从此抽象路径构造的java.nio.file.Path对象。

    4. URI toURI():构造一个表示此抽象路径名的 file: URI。

    5. boolean canExecute():测试应用程序是否可以执行此抽象路径名表示的文件。

    6. boolean canRead():测试应用程序是否可以读取由此抽象路径名表示的文件。

    7. boolean canWrite():测试应用程序是否可以修改由此抽象路径名表示的文件。

  • 示例代码

    // 获取文件信息操作
    {
      File movie = new File("G:\\DY电影\\亡命救护车.ts");
      
      // long lastModified():返回此抽象路径名表示的文件上次修改的时间。
      long lastModified = movie.lastModified();
      LocalDateTime dateTime = Instant.ofEpochMilli(lastModified).atZone(ZoneId.systemDefault()).toLocalDateTime();
      //上次修改的时间:2022-07-30 07:49:42
      System.out.println("上次修改的时间:" + DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss").format(dateTime));
      
      // long length():返回由此抽象路径名表示的文件的长度。
      long length = movie.length();
      long kb = length / 1024;
      long mb = kb / 1024;
      long gb = mb / 1024;
      //文件长度:2449280732B --> 2391875KB --> 2335MB --> 2GB
      System.out.println("文件长度:" + length + "B --> " + kb + "KB --> " + mb + "MB --> " + gb + "GB");
      
      // Path toPath():返回从此抽象路径构造的java.nio.file.Path对象。
      Path path = movie.toPath();
      //java.nio.file.Path:G:\DY电影\亡命救护车.ts
      System.out.println("java.nio.file.Path:" + path);
      
      // URI toURI():构造一个表示此抽象路径名的 file: URI。
      URI uri = movie.toURI();
      //uri:file:/G:/DY电影/亡命救护车.ts
      System.out.println("uri:" + uri);
      
      // boolean canExecute():测试应用程序是否可以执行此抽象路径名表示的文件。
      boolean b1 = movie.canExecute();
      System.out.println("canExecute():" + b1);//canExecute():true
      
      // boolean canRead():测试应用程序是否可以读取由此抽象路径名表示的文件。
      boolean b2 = movie.canRead();
      System.out.println("canRead():" + b2);//canRead():true
      
      // boolean canWrite():测试应用程序是否可以修改由此抽象路径名表示的文件。
      boolean b3 = movie.canWrite();
      System.out.println("canWrite():" + b3);//canWrite():true
    }
    

其他信息查询操作

  • 方法名

    1. long getFreeSpace():返回分区未分配的字节数 。

      • 如果路径中写的文件、目录、盘符,有一个不存在都返回0

      • 使用此方法加上循环,可以利用ASCII码查找出本地的盘符,不过本地盘符的空间必须>0,否则结果不准确。【也可以利用exists()方法判断盘符是否存在】

    2. long getTotalSpace():通过此抽象路径名返回分区 named的大小。

    3. long getUsableSpace():返回上的分区提供给该虚拟机的字节数 named此抽象路径名。

    4. boolean isAbsolute():测试这个抽象路径名是否是绝对的。

  • 示例代码

    // 其他信息查询操作
    {
      File file1 = new File("G:\\DY电影\\亡命救护车.ts");
      
      // long getFreeSpace():返回分区未分配的字节数 named此抽象路径名。
      File file2 = new File("c:\\");
      long freeSpace = file2.getFreeSpace();
      //C盘剩余磁盘未分配的空间大小:92GB
      System.out.println("C盘剩余磁盘未分配的空间大小:" + (freeSpace / 1024 / 1024 / 1024) + "GB");
      
      System.out.println("===== 遍历出本地的所有磁盘,并显示剩余空间 =====");
      //遍历出本地的所有磁盘,并显示剩余空间
      for (int i = 97; i <= (97 + 26); i++) {
        //根据盘符字母创建File对象
        File f = new File((char) i + ":\\");
        //如果盘符存在
        if (f.exists()) {
          //获取总容量【转换成GB】
          long totalSpace = f.getTotalSpace() / 1024 / 1024 / 1024;
          //获取剩余容量【转换成GB】
          long freeSpace1 = f.getFreeSpace() / 1024 / 1024 / 1024;
          System.out.println((char) (i - 32) + "盘容量:" + freeSpace1 + "/" + totalSpace + "\t剩余可用容量:" + (totalSpace - freeSpace1) + "GB");
        }
      }
      System.out.println();
      
      // long getTotalSpace():通过此抽象路径名返回分区的总大小。
      long totalSpace = file1.getTotalSpace();
      //G盘总容量:300GB
      System.out.println("G盘总容量:" + (totalSpace / 1024 / 1024 / 1024) + "GB");
      
      // long getUsableSpace():返回上的分区提供给该虚拟机的字节数。
      long usableSpace = file1.getUsableSpace();
      //G盘分区提供给该虚拟机的字节数:192GB
      System.out.println("G盘分区提供给该虚拟机的字节数:" + (usableSpace / 1024 / 1024 / 1024) + "GB");
      
      // boolean isAbsolute():测试这个抽象路径名是否是绝对的。
      boolean absolute = file1.isAbsolute();
      //1-抽象路径名是否是绝对的:true
      System.out.println("1-抽象路径名是否是绝对的:" + absolute);
      
      //2-抽象路径名是否是绝对的:false
      System.out.println("2-抽象路径名是否是绝对的:" + new File("./file").isAbsolute());
    }
    

判断本地有哪些盘符

  • 使用ASCII码+循环

    //遍历出本地的所有磁盘,并显示剩余空间
    for (int i = 97; i <= (97 + 26); i++) {
      //根据盘符字母创建File对象
      File f = new File((char) i + ":\\");
      //如果盘符存在
      if (f.exists()) {
        //获取总容量【转换成GB】
        long totalSpace = f.getTotalSpace() / 1024 / 1024 / 1024;
        //获取剩余容量【转换成GB】
        long freeSpace1 = f.getFreeSpace() / 1024 / 1024 / 1024;
        System.out.println((char) (i - 32) + "盘容量:" + freeSpace1 + "/" + totalSpace + "\t剩余可用容量:" + (totalSpace - freeSpace1)+"GB");
      }
    }
    
    
    
  • 使用Java自带函数:File.listRoots()

判断操作

  • 方法名

    1. boolean exists():测试此抽象路径名表示的文件或目录是否存在。

    2. boolean isDirectory():测试此抽象路径名表示的文件是否为目录。

    3. boolean isFile():测试此抽象路径名表示的文件是否为普通文件。

    4. boolean isHidden():测试此抽象路径名命名的文件是否为隐藏文件。

  • 示例代码

    // 判断操作
    {
      File file = new File("G:\\DY电影\\亡命救护车.ts");
      
      // boolean exists():测试此抽象路径名表示的文件或目录是否存在。
      boolean exists = file.exists();
      System.out.println("文件或目录是否存在:" + exists);//文件或目录是否存在:true
      
      // boolean isDirectory():测试此抽象路径名表示的文件是否为目录。
      boolean directory = file.isDirectory();
      System.out.println("是否为目录:" + directory);//是否为目录:false
      
      // boolean isFile():测试此抽象路径名表示的文件是否为普通文件。
      boolean isFile = file.isFile();
      System.out.println("是否为普通文件:" + isFile);//是否为普通文件:true
      
      // boolean isHidden():测试此抽象路径名命名的文件是否为隐藏文件。
      File hiddenFile = new File("./file/hidden.txt");
      boolean hidden = hiddenFile.isHidden();
      System.out.println("文件是否为隐藏文件:" + hidden);//文件是否为隐藏文件:true
    }
    

路径查询操作-非列表

  • 方法名

    1. String getPath():将此抽象路径名转换为路径名字符串。【相对路径】

    2. File getAbsoluteFile():返回此抽象路径名的绝对形式。

    3. String getAbsolutePath():返回此抽象路径名的绝对路径名字符串。【绝对路径】

    4. File getCanonicalFile():返回此抽象路径名的规范形式。

    5. String getCanonicalPath():返回此抽象路径名的规范路径名字符串。

    6. String getName():返回由此抽象路径名表示的文件或目录的名称。

      • 返回的类型【文件名.扩展名】例如:name.txt
    7. String getParent():返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。

    8. File getParentFile():返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录。

  • 示例代码

    // 路径查询操作-非列表
    {
      File file = new File("./file/name.txt");
      
      // String getPath():将此抽象路径名转换为路径名字符串。【获取全路径的字符串形式】
      String path = file.getPath();
      //相对路径:.\file\name.txt
      System.out.println("相对路径:" + path);
      
      // File getAbsoluteFile():返回此抽象路径名的绝对形式。
      File absoluteFile = file.getAbsoluteFile();
      //抽象路径名的绝对形式:F:\JavaCode\JavaStudyByMsb\.\file\name.txt
      System.out.println("抽象路径名的绝对形式:" + absoluteFile);
      
      // String getAbsolutePath():返回此抽象路径名的绝对路径名字符串。
      String absolutePath = file.getAbsolutePath();
      //绝对路径名字符串:F:\JavaCode\JavaStudyByMsb\.\file\name.txt
      System.out.println("绝对路径名字符串:" + absolutePath);
      
      // File getCanonicalFile():返回此抽象路径名的规范形式。
      try {
        File canonicalFile = file.getCanonicalFile();
        //抽象路径名的规范形式:F:\JavaCode\JavaStudyByMsb\file\name.txt
        System.out.println("抽象路径名的规范形式:" + canonicalFile);
      } catch (IOException e) {
        e.printStackTrace();
      }
      
      // String getCanonicalPath():返回此抽象路径名的规范路径名字符串。
      try {
        String canonicalPath = file.getCanonicalPath();
        //抽象路径名的规范路径名字符串:F:\JavaCode\JavaStudyByMsb\file\name.txt
        System.out.println("抽象路径名的规范路径名字符串:" + canonicalPath);
      } catch (IOException e) {
        e.printStackTrace();
      }
      
      // String getName():返回由此抽象路径名表示的文件或目录的名称。
      String name = file.getName();
      //文件或目录的名称:name.txt
      System.out.println("文件或目录的名称:" + name);
      
      // String getParent():返回此抽象路径名的父路径名字符串,如果此路径名未命名为父目录,则返回null。
      String parent = file.getParent();
      //抽象路径名的父路径名字符串:.\file
      System.out.println("抽象路径名的父路径名字符串:" + parent);
      
      // File getParentFile():返回此抽象路径名的父,或抽象路径名 null如果此路径名没有指定父目录。
      File parentFile = file.getParentFile();
      //抽象路径名的父:.\file
      System.out.println("抽象路径名的父:" + parentFile);
    }
    

路径查询操作-列表

  • 方法名

    1. String[] list():返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。

    2. String[] list(FilenameFilter filter):返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。

    3. File[] listFiles():返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。

      • 返回数数组元素格式:路径\文件.扩展名
    4. File[] listFiles(FileFilter filter):返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。

      • 返回数数组元素格式:路径\文件.扩展名
    5. File[] listFiles(FilenameFilter filter):返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。

    6. static File[] listRoots():列出可用的文件系统根。【获取本地所有磁盘】

  • 示例代码

    // 路径查询操作-列表
    {
      File file = new File("./file");
      
      // String[] list():返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
      String[] list = file.list();
      //file目录中的文件和目录:[a, hidden.txt, name.txt, temp, time.txt, write, write.txt, 新建文本文档.txt, 这是文件名]
      System.out.println("file目录中的文件和目录:" + Arrays.toString(list));
      
      // String[] list(FilenameFilter filter):返回一个字符串数组,命名由此抽象路径名表示的目录中满足指定过滤器的文件和目录。
      
      //只输出名称以字母t开头的文件,不区分大小写
      FilenameFilter fileNameFilter = (dir, fileName) -> "t".equalsIgnoreCase(fileName.split("")[0]);
      String[] list1 = file.list(fileNameFilter);
      //[temp, time.txt]
      System.out.println(Arrays.toString(list1));
      
      // File[] listFiles():返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
      File[] files = file.listFiles();
      //[.\file\a, .\file\hidden.txt, .\file\name.txt, .\file\temp, .\file\time.txt, .\file\write, .\file\write.txt, .\file\新建文本文档.txt, .\file\这是文件名]
      System.out.println(Arrays.toString(files));
      
      // File[] listFiles(FileFilter filter):返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
      
      //只查找txt文件
      FileFilter fileFilter = fileName -> fileName.getName().contains(".txt");
      File[] files1 = file.listFiles(fileFilter);
      //[.\file\hidden.txt, .\file\name.txt, .\file\T.txt, .\file\time.txt, .\file\write.txt, .\file\新建文本文档.txt]
      System.out.println(Arrays.toString(files1));
      
      // File[] listFiles(FilenameFilter filter):返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
      
      //只输出名称以字母t开头的文件,不区分大小写
      File[] files2 = file.listFiles(fileNameFilter);
      //[.\file\hidden.txt, .\file\name.txt, .\file\T.txt, .\file\time.txt, .\file\write.txt, .\file\新建文本文档.txt]
      // [.\file\T.txt, .\file\temp, .\file\time.txt]
      System.out.println(Arrays.toString(files2));
      
      // static File[] listRoots():列出可用的文件系统根。【获取本地所有磁盘】
      File[] files3 = File.listRoots();
      //[C:\, D:\, F:\, G:\, H:\]
      System.out.println(Arrays.toString(files3));
    }
    

递归删除指定目录下的所有文件/文件夹

/**
 * 递归删除指定目录下的所有文件/文件夹-写法1
 * @param rootFile 指定目录
 */
public static void deleteAll(File rootFile){
  
  File[] allFiles = rootFile.listFiles();
  for (File file : allFiles) {
    //如果是文件,则进行删除
    if(file.isFile()){
      file.delete();
      System.out.println("文件:"+file.getAbsoluteFile());
    }else{
      //如果是文件夹,递归调用
      deleteAll(file);
      //删除完所有的文件之后,删除自己
      file.delete();
      System.out.println("文件夹:"+file.getAbsoluteFile());
    }
  }
  
  //最后删除自己这个根目录
  rootFile.delete();
  return;
}

/**
 * 递归删除指定目录下的所有文件/文件夹-写法2
 * @param rootFile 指定目录
 */
public static void deleteAll2(File rootFile){
  //如果是文件夹
  if (rootFile.isDirectory()) {
    //删除所有的子项
    for (File file : rootFile.listFiles()) {
      deleteAll2(file);
    }
  }
  //然后删除自己
  rootFile.delete();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值