paths.get(uri) 和 path.touri() 是 java nio.2 中安全、可移植的 path 与 uri 互转标准方法:前者要求 uri scheme 为 file 且已按 rfc 2396 编码,后者生成绝对、utf-8 编码、带 file:// scheme 的 uri,仅支持绝对路径。

Java 中 Paths.get(URI) 和 Path.toUri() 是 NIO.2 提供的标准化方式,用于在 Path 和 URI 之间安全、可移植地转换。关键在于理解 URI 的 scheme(如 file:)、编码规则和平台差异,否则容易出现路径解析失败或乱码。
Paths.get(URI):从 URI 构建 Path
该方法适用于已知是本地文件系统 URI 的场景(如 file:///path/to/file),它会自动解码百分号编码,并校验 scheme 是否为 file(非 file scheme 会抛 IllegalArgumentException)。
- 必须确保 URI 的 scheme 是
file,且路径部分符合 RFC 2396 编码规范(空格、中文等需编码为%20、%E4%B8%AD等) - Windows 路径中盘符要写成
file:///C:/dir/file.txt(三个斜杠),不能省略或写成两个 - 推荐用
new File("路径").toURI()或Paths.get("路径").toUri()生成 URI,避免手写错误
Path.toUri():生成标准 file:// URI
Path.toUri() 返回一个绝对、已编码、带 scheme 的 URI,适合作为资源标识或跨组件传递。它会自动处理空格、中文、特殊字符的百分号编码,并补全缺失的主机信息(如 Windows 下变成 file:///C:/...)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 只对绝对路径有意义;相对路径调用
toUri()会抛IllegalStateException - 生成的 URI 总是以
file://开头,且路径部分已 UTF-8 编码,可直接用于Paths.get(uri)回转 - 注意:不同 JDK 版本对 UNC 路径(如
\servershare)支持略有差异,建议先转为本地绝对路径再调用
常见陷阱与规避方式
手动拼接字符串构造 URI 或直接用 new URI("file://...") 容易出错,比如未编码、斜杠数量不对、盘符格式错误等。
- 不要用
new URI("file://" + path)—— 缺少编码且 Windows 盘符格式不兼容 - 避免使用
File.toURI()之外的方式构造 file URI;优先走Paths.get(...).toUri() - 读取配置中的路径字符串时,先用
Paths.get(str)得到 Path,再调toUri(),比反向解析更可靠 - 若 URI 来自网络或用户输入,先检查
uri.getScheme().equals("file")再传给Paths.get()
实用示例:安全互转
以下代码展示了推荐的双向转换流程:
// 字符串路径 → Path → URI(安全)
Path path = Paths.get("data/测试目录/文件 name.txt");
URI uri = path.toUri(); // 自动编码为 file:///...%E6%B5%8B%E8%AF%95...%20name.txt
// URI → Path(要求是 file scheme)
Path restored = Paths.get(uri); // 自动解码,得到原始语义的 Path
// 验证一致性
System.out.println(Files.exists(restored)); // true
System.out.println(restored.equals(path)); // true(同一逻辑路径)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










