File类

java.io.File

  • File类的每一个实例可以表示硬盘(文件系统)中的一个文件或目录(实际上表示的是一个抽象路径)
  • 并没有直接提供移动/复制文件的方法,需要自己手动编写或者直接使用Files 文件工具类
  • File不能访问文件数据
  • 实现了比较器-Comparable接口和Comparator接口和序列化的接口
  • java中new file会占用内存吗_System

File类属性

  • 属性名
  • File.separator:根据当前系统返回一个路径的分隔符
  • 示例代码
System.out.println(File.separator);// \

File类常用方法

  • 列举了45个左右的方法

创建操作

  • 方法名
  1. boolean createNewFile():当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。
  • 返回的是创建是否成功。临时文件已存在返回则创建失败,返回false。不存在则创建成功返回true
  • 注意:最后一级目录是临时文件的名称
  • java中new file会占用内存吗_路径名_02

  1. static File createTempFile(String prefix, String suffix):在默认临时文件目录中创建一个空文件,使用给定的前缀和后缀生成其名称。
  • 默认路径:C:\Users\用户名\AppData\Local\Temp
  • 注意:前缀名称的长度必须大于3;如果后缀为null,默认为.tmp
  • 创建效果
  • java中new file会占用内存吗_路径名_03

  1. static File createTempFile(String prefix, String suffix, File directory):在指定的目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。
  • 创建效果
  1. boolean mkdir():创建由此抽象路径名命名的目录。
  • 只能创建一级目录,如果传入的是多级目录,则会创建失败;
  • 如果目录已存在,也会返回false
  1. boolean mkdirs():创建由此抽象路径名命名的目录
  • 多层目录会级联创建;不会覆盖原有的目录
  • 创建效果
  • java中new file会占用内存吗_java中new file会占用内存吗_04

  • 示例代码
// 创建操作
{
  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():删除由此抽象路径名表示的文件或目录。
  • 如果此路径名表示目录,则目录必须为空才能删除。
  • 删除后不进入回收站
  1. 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对象指定的是新路径,那么相当于对文件进行移动。路径不存在则失败,不加路径默认到项目根目录。
  1. boolean setExecutable(boolean executable):为此抽象路径名设置所有者的执行权限的便利方法。
  2. boolean setExecutable(boolean executable, boolean ownerOnly):设置该抽象路径名的所有者或每个人的执行权限。
  3. boolean setLastModified(long time):设置由此抽象路径名命名的文件或目录的最后修改时间。
  4. boolean setReadable(boolean readable):一种方便的方法来设置所有者对此抽象路径名的读取权限。
  5. boolean setReadable(boolean readable, boolean ownerOnly):设置此抽象路径名的所有者或每个人的读取权限。
  6. boolean setReadOnly():标记由此抽象路径名命名的文件或目录,以便只允许读取操作。
  7. boolean setWritable(boolean writable):一种方便的方法来设置所有者对此抽象路径名的写入权限。
  • 相当于控制是否只读
  1. 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()方法判断盘符是否存在】
  1. long getTotalSpace():通过此抽象路径名返回分区 named的大小。
  2. long getUsableSpace():返回上的分区提供给该虚拟机的字节数 named此抽象路径名。
  3. 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
  1. String getParent():返回此抽象路径名的父 null的路径名字符串,如果此路径名未命名为父目录,则返回null。
  2. 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():返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
  • 返回数数组元素格式:路径\文件.扩展名
  1. File[] listFiles(FileFilter filter):返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
  • 返回数数组元素格式:路径\文件.扩展名
  1. File[] listFiles(FilenameFilter filter):返回一个抽象路径名数组,表示由此抽象路径名表示的满足指定过滤器的目录中的文件和目录。
  2. 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();
}