Java File 类核心用法详解
1、File 类概述
File 类是 Java 中用于处理文件和目录路径名的核心类,位于 java.io 包中。它以抽象的方式代表文件名和目录路径名,主要用于文件和目录的创建、查找、删除等操作。
核心概念:
- File 对象代表磁盘中实际存在的文件和目录
- File 类不能访问文件内容本身,需要使用输入/输出流
- File 类提供了跨平台的文件操作方法
构造方法:
- File(String pathname):通过路径名字符串创建 File 对象
- File(String parent, String child):通过父路径和子路径创建 File 对象
- File(File parent, String child):通过父 File 对象和子路径创建 File 对象
- File(URI uri):通过 URI 创建 File 对象
常用常量:
- pathSeparator:分隔连续多个路径字符串的分隔符,Windows 下为分号(;)
- separator:分隔同一个路径字符串中的目录,Windows 下为反斜线(\)
示例:
// 通过路径字符串创建
File file1 = new File("C:/test/test.txt");
// 通过父路径和子路径创建
File file2 = new File("C:/test", "test.txt");
// 通过父 File 对象和子路径创建
File parent = new File("C:/test");
File file3 = new File(parent, "test.txt");2、文件和目录的创建
2.1、创建文件
使用 createNewFile() 方法创建文件:
File file = new File("C:/test/test.txt");
try {
boolean result = file.createNewFile();
if (result) {
System.out.println("文件创建成功");
} else {
System.out.println("文件已存在");
}
} catch (IOException e) {
e.printStackTrace();
}注意事项:
- 当且仅当不存在具有指定名称的文件时,创建一个新的空文件
- 返回 true 表示创建成功,false 表示文件已存在
- 需要处理 IOException 异常
2.2、创建目录
使用 mkdir() 和 mkdirs() 方法创建目录:
// 创建单级目录
File dir1 = new File("C:/test");
boolean result1 = dir1.mkdir();
// 创建多级目录
File dir2 = new File("C:/test/a/b/c");
boolean result2 = dir2.mkdirs();区别:
- mkdir():只能创建单级文件夹,如果父目录不存在则创建失败
- mkdirs():可以创建多级文件夹,包括创建必需但不存在的父目录
2.3、创建临时文件
使用 createTempFile() 方法创建临时文件:
try {
// 在默认临时文件目录中创建
File tempFile1 = File.createTempFile("prefix", ".suffix");
// 在指定目录中创建
File directory = new File("C:/temp");
File tempFile2 = File.createTempFile("prefix", ".suffix", directory);
System.out.println("临时文件路径:" + tempFile1.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}3、文件和目录的判断与获取
3.1、判断方法
File 类提供了多种判断方法:
File file = new File("C:/test/test.txt");
// 判断文件或目录是否存在
boolean exists = file.exists();
// 判断是否为文件
boolean isFile = file.isFile();
// 判断是否为目录
boolean isDirectory = file.isDirectory();
// 判断是否可读
boolean canRead = file.canRead();
// 判断是否可写
boolean canWrite = file.canWrite();
// 判断是否隐藏
boolean isHidden = file.isHidden();
// 判断是否为绝对路径
boolean isAbsolute = file.isAbsolute();3.2、获取方法
File 类提供了多种获取方法:
File file = new File("C:/test/test.txt");
// 获取文件或目录名称
String name = file.getName();
// 获取绝对路径
String absolutePath = file.getAbsolutePath();
// 获取路径
String path = file.getPath();
// 获取父目录路径
String parent = file.getParent();
// 获取父目录 File 对象
File parentFile = file.getParentFile();
// 获取文件大小(字节数)
long length = file.length();
// 获取最后修改时间
long lastModified = file.lastModified();
// 获取所有根目录
File[] roots = File.listRoots();3.3、目录遍历
遍历目录中的文件和子目录:
File dir = new File("C:/test");
// 获取目录下的文件和目录名称
String[] names = dir.list();
for (String name : names) {
System.out.println(name);
}
// 获取目录下的文件和目录对象
File[] files = dir.listFiles();
for (File file : files) {
System.out.println(file.getName());
}
// 使用过滤器
File[] txtFiles = dir.listFiles((dir1, name) -> name.endsWith(".txt"));
for (File file : txtFiles) {
System.out.println(file.getName());
}4、文件和目录的删除与重命名
4.1、删除文件和目录
使用 delete() 和 deleteOnExit() 方法删除:
File file = new File("C:/test/test.txt");
// 立即删除
boolean result = file.delete();
if (result) {
System.out.println("删除成功");
} else {
System.out.println("删除失败");
}
// JVM 退出时删除
file.deleteOnExit();注意事项:
- delete() 方法可以删除文件或空目录
- delete() 不能删除非空目录
- deleteOnExit() 方法在虚拟机终止时删除文件,用于删除临时文件
4.2、重命名文件和目录
使用 renameTo() 方法重命名:
File oldFile = new File("C:/test/old.txt");
File newFile = new File("C:/test/new.txt");
boolean result = oldFile.renameTo(newFile);
if (result) {
System.out.println("重命名成功");
} else {
System.out.println("重命名失败");
}renameTo() 方法的多种用途:
- 重命名:目标文件与源文件在同一个路径下
- 移动:目标文件与源文件不在同一个路径下
- 注意:不能操作文件夹
示例:
// 重命名文件
File file1 = new File("C:/test/a.txt");
File file2 = new File("C:/test/b.txt");
file1.renameTo(file2);
// 移动文件
File file3 = new File("C:/test/a.txt");
File file4 = new File("C:/temp/a.txt");
file3.renameTo(file4);4.3、设置文件属性
File file = new File("C:/test/test.txt");
// 设置只读
boolean readOnly = file.setReadOnly();
// 设置最后修改时间
long time = System.currentTimeMillis();
boolean modified = file.setLastModified(time);5、文件的读取与写入
5.1、读取文件内容
使用输入流读取文件内容:
File file = new File("C:/test/test.txt");
// 使用 FileInputStream 读取字节
try (FileInputStream fis = new FileInputStream(file)) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, length));
}
} catch (IOException e) {
e.printStackTrace();
}
// 使用 BufferedReader 读取文本
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// 使用 InputStreamReader 指定编码
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(file), "GBK"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}5.2、写入文件内容
使用输出流写入文件内容:
File file = new File("C:/test/test.txt");
// 使用 FileOutputStream 写入字节
try (FileOutputStream fos = new FileOutputStream(file)) {
String content = "Hello, World!";
fos.write(content.getBytes());
} catch (IOException e) {
e.printStackTrace();
}
// 使用 FileWriter 写入字符
try (FileWriter writer = new FileWriter(file, true)) {
writer.write("Hello, World!\n");
} catch (IOException e) {
e.printStackTrace();
}
// 使用 PrintWriter 写入
try (PrintWriter writer = new PrintWriter(new FileWriter(file, true))) {
writer.println("Hello, World!");
} catch (IOException e) {
e.printStackTrace();
}注意事项:
- FileOutputStream 和 FileWriter 的第二个参数为 true 表示追加模式
- PrintWriter 的第二个参数为 true 表示自动刷新缓冲区
5.3、文件复制
实现文件复制功能:
public void copyFile(String sourcePath, String targetPath) {
File sourceFile = new File(sourcePath);
File targetFile = new File(targetPath);
try (FileInputStream fis = new FileInputStream(sourceFile);
FileOutputStream fos = new FileOutputStream(targetFile)) {
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) != -1) {
fos.write(buffer, 0, length);
}
System.out.println("文件复制成功");
} catch (IOException e) {
e.printStackTrace();
}
}Java File 类是文件操作的核心类,提供了丰富的文件和目录操作方法。通过 File 类,可以实现文件和目录的创建、删除、重命名、判断、获取属性等操作。需要注意的是,File 类不能直接访问文件内容,需要配合输入/输出流使用。
掌握 File 类的核心用法,对于 Java 开发者来说是一项基本技能。在实际开发中,需要注意:
- 处理文件操作可能抛出的异常
- 考虑跨平台兼容性,使用 separator 常量
- 及时关闭文件流,避免资源泄漏
- 处理文件不存在、权限不足等异常情况
通过合理使用 File 类,可以高效地完成各种文件操作任务,为应用程序提供强大的文件管理能力。

