Java File 类详细说明及示例
·
Java File 类是 java.io 包中用于处理文件和目录路径名的核心类。它提供了丰富的方法来操作文件系统。
目录结构
概述
File 类代表文件系统中文件或目录的抽象路径名,可以用于:
- 创建、删除文件和目录
- 查询文件属性(大小、权限、修改时间等)
- 遍历目录内容
- 检查文件存在性
构造方法
import java.io.File;
import java.io.IOException;
public class FileConstructorExamples {
public static void main(String[] args) {
// 1. 通过路径字符串创建File对象
File file1 = new File("test.txt");
// 2. 通过父路径和子路径创建
File file2 = new File("/home/user", "documents/test.txt");
// 3. 通过父File对象和子路径创建
File parentDir = new File("/home/user");
File file3 = new File(parentDir, "documents/test.txt");
// 4. 使用URI创建
try {
java.net.URI uri = new java.net.URI("file:///home/user/test.txt");
File file4 = new File(uri);
} catch (Exception e) {
e.printStackTrace();
}
}
}
常用方法分类
1. 文件/目录检测方法
public class FileCheckMethods {
public static void main(String[] args) {
File file = new File("example.txt");
// 检查文件/目录是否存在
System.out.println("是否存在: " + file.exists());
// 检查是否是文件
System.out.println("是否是文件: " + file.isFile());
// 检查是否是目录
System.out.println("是否是目录: " + file.isDirectory());
// 检查是否是隐藏文件
System.out.println("是否隐藏: " + file.isHidden());
// 检查是否可读
System.out.println("是否可读: " + file.canRead());
// 检查是否可写
System.out.println("是否可写: " + file.canWrite());
// 检查是否可执行
System.out.println("是否可执行: " + file.canExecute());
}
}
2. 文件属性获取方法
public class FileAttributeMethods {
public static void main(String[] args) {
File file = new File("example.txt");
if (file.exists()) {
// 获取文件名
System.out.println("文件名: " + file.getName());
// 获取文件路径
System.out.println("路径: " + file.getPath());
System.out.println("绝对路径: " + file.getAbsolutePath());
try {
System.out.println("规范路径: " + file.getCanonicalPath());
} catch (IOException e) {
e.printStackTrace();
}
// 获取父目录
System.out.println("父目录: " + file.getParent());
// 获取文件大小(字节)
System.out.println("文件大小: " + file.length() + " 字节");
// 获取最后修改时间
System.out.println("最后修改时间: " + new Date(file.lastModified()));
// 获取可用空间信息
System.out.println("总空间: " + file.getTotalSpace() + " 字节");
System.out.println("可用空间: " + file.getFreeSpace() + " 字节");
System.out.println("可用空间(系统): " + file.getUsableSpace() + " 字节");
}
}
}
3. 文件操作方泔
public class FileOperationMethods {
public static void main(String[] args) {
try {
// 创建文件
File newFile = new File("newfile.txt");
boolean created = newFile.createNewFile();
System.out.println("文件创建" + (created ? "成功" : "失败"));
// 重命名文件
File renamedFile = new File("renamedfile.txt");
boolean renamed = newFile.renameTo(renamedFile);
System.out.println("重命名" + (renamed ? "成功" : "失败"));
// 删除文件
boolean deleted = renamedFile.delete();
System.out.println("删除" + (deleted ? "成功" : "失败"));
// 创建临时文件
File tempFile = File.createTempFile("prefix", ".suffix");
System.out.println("临时文件: " + tempFile.getAbsolutePath());
tempFile.deleteOnExit(); // 程序退出时删除
// 设置文件权限
tempFile.setReadable(true);
tempFile.setWritable(true);
tempFile.setExecutable(false);
// 设置最后修改时间
tempFile.setLastModified(System.currentTimeMillis());
} catch (IOException e) {
e.printStackTrace();
}
}
}
4. 目录操作方法
public class DirectoryOperationMethods {
public static void main(String[] args) {
// 创建单级目录
File dir1 = new File("single_dir");
boolean dirCreated1 = dir1.mkdir();
System.out.println("单级目录创建: " + dirCreated1);
// 创建多级目录
File dir2 = new File("parent/child/grandchild");
boolean dirCreated2 = dir2.mkdirs();
System.out.println("多级目录创建: " + dirCreated2);
// 列出目录内容
if (dir1.isDirectory()) {
// 列出文件和目录名
String[] fileNames = dir1.list();
System.out.println("目录内容(名称):");
if (fileNames != null) {
for (String name : fileNames) {
System.out.println(" " + name);
}
}
// 列出File对象
File[] files = dir1.listFiles();
System.out.println("目录内容(File对象):");
if (files != null) {
for (File file : files) {
System.out.println(" " + file.getName() +
" (" + (file.isDirectory() ? "目录" : "文件") + ")");
}
}
// 使用文件名过滤器
File[] txtFiles = dir1.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
}
});
}
// 获取根目录
File[] roots = File.listRoots();
System.out.println("系统根目录:");
for (File root : roots) {
System.out.println(" " + root.getAbsolutePath());
}
}
}
5. 路径操作方法
public class PathOperationMethods {
public static void main(String[] args) {
File file = new File("../parent/./child/../file.txt");
System.out.println("原始路径: " + file.getPath());
System.out.println("绝对路径: " + file.getAbsolutePath());
try {
// 获取规范路径(去除 . 和 ..)
System.out.println("规范路径: " + file.getCanonicalPath());
// 使用toPath()转换为Path对象(NIO.2)
java.nio.file.Path path = file.toPath();
System.out.println("Path对象: " + path);
// 使用toURI()获取URI
java.net.URI uri = file.toURI();
System.out.println("URI: " + uri);
} catch (IOException e) {
e.printStackTrace();
}
// 路径比较
File file1 = new File("file.txt");
File file2 = new File("./file.txt");
System.out.println("路径相等: " + file1.equals(file2));
System.out.println("规范路径比较: " +
file1.getAbsolutePath().equals(file2.getAbsolutePath()));
}
}
完整示例代码
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Date;
public class CompleteFileExample {
public static void main(String[] args) {
// 创建测试目录和文件
createTestStructure();
// 演示各种文件操作
demonstrateFileOperations();
// 文件遍历示例
traverseDirectory();
}
private static void createTestStructure() {
try {
// 创建目录结构
File baseDir = new File("test_directory");
if (!baseDir.exists()) {
baseDir.mkdir();
}
// 创建子目录
File subDir1 = new File(baseDir, "subdir1");
File subDir2 = new File(baseDir, "subdir2");
subDir1.mkdir();
subDir2.mkdir();
// 创建测试文件
createTestFile(new File(baseDir, "file1.txt"));
createTestFile(new File(subDir1, "file2.txt"));
createTestFile(new File(subDir2, "file3.txt"));
System.out.println("测试目录结构创建完成");
} catch (Exception e) {
e.printStackTrace();
}
}
private static void createTestFile(File file) throws IOException {
if (!file.exists()) {
file.createNewFile();
// 写入一些内容
java.io.FileWriter writer = new java.io.FileWriter(file);
writer.write("这是测试文件: " + file.getName());
writer.close();
}
}
private static void demonstrateFileOperations() {
File testFile = new File("test_directory/file1.txt");
System.out.println("\n=== 文件属性演示 ===");
System.out.println("文件名: " + testFile.getName());
System.out.println("绝对路径: " + testFile.getAbsolutePath());
System.out.println("文件大小: " + testFile.length() + " 字节");
System.out.println("最后修改: " + new Date(testFile.lastModified()));
System.out.println("可读: " + testFile.canRead());
System.out.println("可写: " + testFile.canWrite());
// 文件移动示例
File movedFile = new File("test_directory/subdir1/moved_file.txt");
boolean moved = testFile.renameTo(movedFile);
System.out.println("文件移动: " + (moved ? "成功" : "失败"));
}
private static void traverseDirectory() {
System.out.println("\n=== 目录遍历演示 ===");
File baseDir = new File("test_directory");
if (baseDir.exists() && baseDir.isDirectory()) {
traverseDirectoryRecursive(baseDir, 0);
}
}
private static void traverseDirectoryRecursive(File dir, int level) {
// 缩进显示层级
String indent = " ".repeat(level);
System.out.println(indent + "📁 " + dir.getName() + "/");
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
traverseDirectoryRecursive(file, level + 1);
} else {
System.out.println(indent + " 📄 " + file.getName() +
" (" + file.length() + " bytes)");
}
}
}
// 清理:删除测试文件
if (level == 0) {
deleteDirectory(dir);
System.out.println("\n测试文件已清理");
}
}
private static void deleteDirectory(File dir) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
deleteDirectory(file);
}
}
}
dir.delete();
}
}
高级用法示例
1. 文件过滤器使用
public class FileFilterExample {
public static void main(String[] args) {
File dir = new File(".");
// 使用匿名类实现文件名过滤器
String[] javaFiles = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
// 使用Lambda表达式(Java 8+)
String[] classFiles = dir.list((d, name) -> name.endsWith(".class"));
// 使用FileFilter
File[] hiddenFiles = dir.listFiles(file -> file.isHidden());
System.out.println("Java文件:");
if (javaFiles != null) {
for (String file : javaFiles) {
System.out.println(" " + file);
}
}
}
}
2. 递归文件搜索
public class FileSearchExample {
public static void main(String[] args) {
File startDir = new File(".");
String targetExtension = ".java";
System.out.println("搜索 " + targetExtension + " 文件:");
searchFiles(startDir, targetExtension);
}
private static void searchFiles(File dir, String extension) {
if (dir.isDirectory()) {
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
searchFiles(file, extension); // 递归搜索子目录
} else if (file.getName().endsWith(extension)) {
System.out.println("找到: " + file.getAbsolutePath());
}
}
}
}
}
}
注意事项
- 路径分隔符: 使用
File.separator代替硬编码的/或\以保证跨平台兼容性 - 异常处理: 文件操作可能抛出
IOException,需要进行适当处理 - 性能考虑: 对于大量文件操作,考虑使用
java.nio.file包(NIO.2) - 资源管理: 使用 try-with-resources 确保文件资源正确关闭
- 安全性: 检查文件权限,避免安全漏洞
// 正确的路径分隔符使用
File file = new File("dir" + File.separator + "file.txt");
// 使用try-with-resources
try (java.io.FileWriter writer = new java.io.FileWriter(file)) {
writer.write("内容");
} catch (IOException e) {
e.printStackTrace();
}
File类虽然功能强大,但在Java 7及以上版本中,推荐使用 java.nio.file 包中的 Path 和 Files 类,它们提供了更现代、功能更丰富的文件操作API。
更多推荐


所有评论(0)