Java File 类是 java.io 包中用于处理文件和目录路径名的核心类。它提供了丰富的方法来操作文件系统。

目录结构

  1. File 类概述
  2. 构造方法
  3. 常用方法分类
  4. 完整示例代码
  5. 注意事项

概述

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());
                    }
                }
            }
        }
    }
}

注意事项

  1. 路径分隔符: 使用 File.separator 代替硬编码的 /\ 以保证跨平台兼容性
  2. 异常处理: 文件操作可能抛出 IOException,需要进行适当处理
  3. 性能考虑: 对于大量文件操作,考虑使用 java.nio.file 包(NIO.2)
  4. 资源管理: 使用 try-with-resources 确保文件资源正确关闭
  5. 安全性: 检查文件权限,避免安全漏洞
// 正确的路径分隔符使用
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 包中的 PathFiles 类,它们提供了更现代、功能更丰富的文件操作API。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐