Java File类 详解和常用方法

363 阅读7分钟

java.io.File 类是 Java 中用于处理文件和目录路径的类。它提供了文件和目录的创建、删除、重命名等操作,但不直接用于文件的读写。File 类可以用来获取文件和目录的属性,如大小、修改时间等。

主要功能

  • 文件和目录的创建、删除和重命名createNewFile()delete()renameTo(File dest)
  • 检查文件或目录是否存在exists()
  • 获取文件或目录的属性:如length()(大小)、lastModified()(最后修改时间)。
  • 列出目录内容list()listFiles()
  • 检查是文件还是目录isFile()isDirectory()
  • 创建和删除目录mkdir()mkdirs()rmdir()

目录路径

在处理文件和目录时,路径有两种不同的表示方式绝对路径相对路径。它们在Java中的java.io.File类和其他相关类中经常使用。

绝对路径

  • 定义:绝对路径是从文件系统的根目录开始的完整路径。它指定了从根目录到文件或目录的确切位置。

  • 特点

    • 不依赖于当前工作目录。
    • 总是以根目录(如Windows中的盘符C:D:,或Unix/Linux中的/)开始。
    • 在不同的系统之间通常不可移植。

代码示例(Windows系统)

// 使用绝对路径创建File对象
File absFile = new File("D:\home\mixia\java.txt");
System.out.println("绝对路径: " + absFile.getAbsolutePath());

相对路径

  • 定义:相对路径是相对于当前工作目录的路径。它不指定从根目录开始的完整位置。

  • 特点

    • 依赖于当前工作目录。
    • 不以根目录开始。
    • 在不同的系统之间更易于移植。
// 获取当前工作目录
String workingDirectory = System.getProperty("user.dir");
System.out.println("当前工作目录:" + workingDirectory);
​
// 使用相对路径创建File对象
File file = new File("uploads/java.txt");
System.out.println("相对路径:" + file.getAbsolutePath());

注意事项

  • 路径分隔符:Windows系统使用反斜杠``作为路径分隔符,而Unix/Linux系统使用斜杠/

    • 在Java中,你可以使用File.separator来获取当前系统的路径分隔符,以确保跨平台兼容性。
  • 当前工作目录:在Java中,当前工作目录通常是启动Java虚拟机时的工作目录。你可以使用System.getProperty("user.dir")来获取当前工作目录的路径。

构造方法

  • File(String pathname):根据给定的路径名字符串创建 File 对象。
// 路径和文件名
String pathname = "D:\home\mixia\java.txt";
// 创建 File实例
File f1 = new File(pathname);
System.out.println(f1);// 输出: D:\home\mixia\java.txt
  • File(String parent, String child):根据父目录路径名和子文件或目录名创建 File 对象。
// 路径
String path = "D:\home\mixia";
// 文件名
String fileName = "java.txt";
// 创建 File实例
File file = new File(path, fileName);
System.out.println(file);// 输出:D:\home\mixia\java.txt
  • File(File parent, String child):根据父 File 对象和子文件或目录名创建 File 对象。
// 创建 父File对象
File f1 = new File("D:\home\mixia");
// 创建 File实例
File f2 = new File(f1, "java.txt");
System.out.println(f2);//输出: D:\home\mixia\java.txt

常用方法

路径操作

  • String getAbsolutePath():获取文件或目录的绝对路径。
  • String getPath():获取文件或目录的路径。
  • String getName():获取文件或目录的名称。
  • String getParent():获取文件或目录的父路径。
  • File getParentFile():获取文件或目录的父 File 对象。
  • boolean isAbsolute():判断路径是否为绝对路径。
  • File getCanonicalFile():返回此 File 对象的规范路径名形式,处理符号链接等特殊情况。
// 使用相对路径创建File对象
File file = new File("uploads/java.txt");
​
// 获取文件或目录的绝对路径
System.out.println("相对路径: " + file.getAbsolutePath());
// 获取文件或目录的路径。
System.out.println("路径: " + file.getPath());
// 获取文件或目录的名称。
System.out.println("文件名: " + file.getName());
// 获取文件或目录的父路径。
System.out.println("父路径: " + file.getParent());
// 获取文件或目录的父File对象
System.out.println("父File对象: " + file.getParentFile());
// 判断路径是否为绝对路径。
System.out.println("是否为绝对路径? " + file.isAbsolute());
// 返回此 File 对象的规范路径名形式
System.out.println("规范路径名: "+ file.getCanonicalFile()); // 会有IO异常

文件属性检查

  • boolean exists():判断文件或目录是否存在。
  • boolean isDirectory():判断是否为目录。
  • boolean isFile():判断是否为普通文件。
  • long length():获取文件的长度(字节数)。
  • long lastModified():获取最后一次修改时间(毫秒值)。
// 文件路径
String filePath = "uploads/java.txt";
// 使用相对路径创建File对象
File file = new File(filePath);
​
// 判断文件或目录是否存在
System.out.println("文件是否存在? " + file.exists());
// 判断是否为目录
System.out.println("判断是否为目录? " + file.isDirectory());
// 判断是否为普通文件
System.out.println("判断是否为普通文件? " + file.isFile());
if (file.isFile()) {
    // 获取文件的长度(字节数)
    System.out.println("文件长度: " + file.length() + " 字节");
    // 获取最后一次修改时间(毫秒值)
    System.out.println("最后修改时间: " + file.lastModified());
}

目录操作

  • String[] list():列出目录下所有子文件和子目录的名称。
String filePath = "uploads/";// 更改为自己想查看的文件路径
// 创建File对象
File file = new File(filePath);
// 列出指定目录下 子文件名和子目录的名称
String[] list = file.list();
// 数组转字符串并输出
System.out.println(Arrays.toString(list));
  • File[] listFiles():列出目录下所有子文件和子目录的 File 对象。
String filePath = "uploads/";// 更改为自己想查看的文件路径
// 创建File对象
File file = new File(filePath);
// 列出目录下所有子文件和子目录的 `File` 对象
File[] filesList = file.listFiles();
// 遍历File对象数组,获取每个子对象
for (File file1 : filesList) {
    System.out.println(file1);
}
  • boolean mkdir():创建一个新的空目录。如果该目录已经存在,此方法将不会做任何事情。
// 要创建的新目录名
String newPath = "new_uploads";
// 创建File对象
File file = new File(newPath);
// 创建目录
boolean is_mkdir = file.mkdir();
if (is_mkdir) {
    System.out.println(newPath + "目录创建成功!");
} else {
    System.out.println(newPath + "目录创建失败!");
}
  • boolean mkdirs():创建多级目录(如果父目录不存在,会一并创建)。
// 要创建的新目录名
String newPath = "dir002/new_uploads";
// 创建File对象
File file = new File(newPath);
// 创建目录
boolean is_mkdir = file.mkdirs();
if (is_mkdir) {
    System.out.println(newPath + "目录创建成功!");
} else {
    System.out.println(newPath + "目录创建失败!");
}
  • boolean delete():删除文件或空目录。
// 要删除的目录
String deletePath = "uploads/dir002/new_uploads";
// 创建 File 类
File file = new File(deletePath);
// 执行删除
boolean isDelete = file.delete();
if (isDelete){
    System.out.println("删除成功!");
}else {
    System.out.println("删除失败!");
}
  • boolean deleteOnExit():注册一个文件,使得在Java虚拟机(JVM)退出时自动删除该文件。这个方法常用于临时文件的处理,确保即使在程序异常终止或忘记手动删除的情况下,临时文件也能被自动清除。
// 要删除的目录
String deletePath = "uploads/dir002";
// 创建一个 File 类
File file = new File(deletePath);
// 执行注册删除(没有返回值)
file.deleteOnExit();

文件操作

  • boolean createNewFile():创建一个新文件。

    • 如果文件不存在,该方法将创建一个新文件,并返回 true
    • 如果文件已存在,则不创建新文件,并返回 false
    • 这个方法常用于确保不会覆盖已存在的文件,同时创建新文件。
// 设置要创建的文件的路径
String filePath = "uploads/dir001/file.txt";
// 创建File类
File fileToCreate  = new File(filePath);
// 创建新文件
try {
    boolean isCreated = fileToCreate.createNewFile();
    if (isCreated) {
        System.out.println("文件已成功创建: " + filePath);
    } else {
        System.out.println("文件已存在: " + filePath);
    }
} catch (IOException e) {
    System.out.println("创建文件时发生错误");
    throw new RuntimeException(e);
}
  • boolean renameTo(File dest):将文件或目录重命名为给定的目标路径。

    • 如果重命名操作成功,则返回 true
    • 如果操作失败,则返回 false
    • 这个方法可以用于移动文件或目录,只需将目标路径设置为不同的目录即可。
// 设置要重命名的文件或目录的路径
String oldPath = "uploads/dir001/file.txt";
// 设置新的文件或目录的路径
String newPath = "uploads/dir001/newFile.txt";
​
// 创建File对象
File oldFile = new File(oldPath);
File newFile = new File(newPath);
​
// 尝试重命名文件或目录
boolean isRenamed = oldFile.renameTo(newFile);
​
if (isRenamed) {
    System.out.println("文件/目录已成功重命名: " + oldPath + " -> " + newPath);
} else {
    System.out.println("重命名文件/目录失败");
}

注意事项

  • File 类只能操作文件和目录的元数据(如名称、路径、属性),不能用于文件内容的读写。文件内容的读写需要使用输入/输出流(如 FileInputStreamFileOutputStream)。
  • File 类的方法大部分是独立于平台的,但某些操作(如符号链接的处理)可能受底层文件系统的影响。
  • File 类的设计早于Java NIO(New I/O),后者提供了更高级的文件I/O操作。