Java NIO.2 的 Paths 和 Files 类自JDK 7起提供清晰、安全、跨平台的文件操作,Paths构建解析路径,Files执行I/O,均基于Path对象,语义直观、异常合理。

Java NIO.2 的 Paths 和 Files 类从 JDK 7 开始提供了一套更清晰、更安全、跨平台的文件操作方式,彻底替代了老旧的 java.io.File。它们分工明确:Paths 负责构建和解析路径,Files 负责执行实际 I/O 操作,所有方法都基于 Path 对象,语义直观,异常体系也更合理。
用 Paths 构建和处理路径
Paths 是一个工具类,只提供静态方法创建 Path 实例。Path 本身是不可变的抽象引用,不检查文件是否存在,只描述位置结构。
- 用
Paths.get("a", "b", "c.txt")或Path.of("a", "b", "c.txt")(推荐,Paths.get()可能被弃用)自动适配系统分隔符(Windows 用\,Unix 用/) - 相对路径基于进程当前工作目录(如 IDEA 中默认为项目根目录),可用
p.toAbsolutePath()转为绝对路径 - 常用解析方法:
p.getFileName()获取末段(如"c.txt"),p.getParent()获取上级目录,p.getRoot()获取根(如"C:\"或"/") - 拼接子路径用
p.resolve("backup.log"),比字符串拼接安全;计算相对路径用p.relativize(other)
用 Files 执行常见文件操作
Files 是纯静态工具类,所有方法第一个参数都是 Path,统一抛出 IOException 或其子类(如 NoSuchFileException),不再需要手动判断返回值或捕获模糊异常。
-
读写文本:直接用
Files.readString(path, UTF_8)和Files.writeString(path, content, CREATE, WRITE),自动处理编码与资源关闭 -
读写字节:
Files.readAllBytes(path)适合小文件;大文件建议用流:Files.newBufferedReader(path)或Files.newOutputStream(path, APPEND) -
复制移动:
Files.copy(src, dst, REPLACE_EXISTING)支持跨文件系统;Files.move(src, dst, ATOMIC_MOVE)在支持时保证原子性 -
目录操作:
Files.createDirectories(path)递归创建多级目录;Files.list(path)流式遍历一级内容;Files.walk(path)支持深度遍历并过滤
创建、删除和存在性判断
这些基础操作现在有明确语义和对应异常,避免误判:
- 创建空文件:
Files.createFile(path)(已存在抛FileAlreadyExistsException) - 创建目录:
Files.createDirectory(path)(仅建最后一级);Files.createDirectories(path)(连同父级一起建) - 删除:
Files.delete(path)(不存在或非文件则抛异常);Files.deleteIfExists(path)更安全 - 判断存在性:
Files.exists(path);区分类型:Files.isRegularFile(path)、Files.isDirectory(path)
注意路径与文件系统的实际关系
Path 是逻辑路径,不代表真实文件。例如 Paths.get("nonexistent.txt") 总能成功创建,但 Files.exists() 返回 false。若需获取真实路径(如解析符号链接、标准化盘符),可调用 p.toRealPath()(会抛 IOException)。URI 转换也支持:p.toUri() → Paths.get(uri),适用于 jar 包内资源定位。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











