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