Java 7 的 Paths 和 Files 类简化文件操作:Paths.get() 安全构建跨平台路径,Files 提供读写、复制、遍历等静态方法,支持 UTF-8、符号链接、权限控制及异常处理。

Java 7 引入了 java.nio.file 包,其中 Paths 和 Files 是两个核心工具类,大幅简化了传统 File 类繁琐的路径拼接、文件读写、目录遍历等操作。它们基于 Path 抽象,支持符号链接、权限控制、原子操作,并且默认使用 UTF-8,避免乱码问题。
用 Paths 快速构建安全、可移植的路径对象
Paths.get() 是创建 Path 实例最简洁的方式,自动处理不同操作系统的路径分隔符(如 Windows 的 \ 和 Linux/macOS 的 /),无需手动拼接字符串或担心转义问题。
- 单段路径:
Path p = Paths.get("data", "config.json");→ 自动转为data/config.json(Unix)或data\config.json(Windows) - 绝对路径:
Paths.get("/home/user", "docs", "report.txt")→ 等效于/home/user/docs/report.txt - 支持 URI:
Paths.get(URI.create("file:///tmp/log.txt"))
相比 new File("a" + File.separator + "b").toPath(),Paths.get() 更简洁、语义更清晰,且返回的是不可变的 Path,线程安全。
用 Files 一行代码完成常见文件操作
Files 提供大量静态方法,覆盖创建、读写、复制、删除、属性检查等场景,多数方法直接接受 Path,异常明确(抛 IOException 或 SecurityException),无需手动包装流。
立即学习“Java免费学习笔记(深入)”;
- 读取文本文件(自动关闭流、默认 UTF-8):
List<String> lines = Files.readAllLines(Paths.get("input.txt")); - 写入文本(覆盖或追加):
Files.write(Paths.get("output.txt"), "Hello".getBytes());或Files.write(p, lines, StandardCharsets.UTF_8, StandardOpenOption.APPEND); - 复制/移动文件:
Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); - 创建目录(含父目录):
Files.createDirectories(Paths.get("logs/2024/06")); - 检查存在性与类型:
Files.exists(p)、Files.isDirectory(p)、Files.isRegularFile(p)
配合 walk() 和 list() 高效遍历目录
替代容易出错的递归 File.listFiles(),Files.walk() 返回 Stream<Path>,支持函数式过滤和终止;Files.list() 则只遍历一级子项,更轻量。
- 查找所有 .log 文件(深度优先):
Files.walk(Paths.get("logs")) .filter(p -> p.toString().endsWith(".log")) .forEach(System.out::println); - 仅列出当前目录下的普通文件:
Files.list(dir).filter(Files::isRegularFile).forEach(System.out::println); - 注意:
walk()默认不遵循符号链接,如需启用,传入FileVisitOption.FOLLOW_LINKS
处理异常与权限等实际细节
Files 方法虽方便,但调用时仍需关注底层 I/O 异常和访问控制。建议结合 try-with-resources(对返回流的方法)或捕获具体异常,避免静默失败。
- 读大文件时用
Files.lines()返回懒加载 Stream,防止 OOM:try (Stream<String> stream = Files.lines(p)) { ... } - 设置文件权限(POSIX 系统):
Files.setPosixFilePermissions(p, EnumSet.of(PosixFilePermission.OWNER_READ, PosixFilePermission.OWNER_WRITE)); - 获取基本属性:
BasicFileAttributes attrs = Files.readAttributes(p, BasicFileAttributes.class);可查修改时间、大小、是否为目录等
不复杂但容易忽略。用好 Paths 和 Files,能让 Java 文件操作变得直观、健壮、跨平台。


















