推荐使用 file.touri().tourl():file.touri() 严格编码特殊字符并跨平台兼容,生成合法 file:// uri;而 file.tourl() 不自动转义空格等非法字符,易导致 malformedurlexception,已废弃,仅用于旧代码兼容。

File.toURI() 和 File.toURL() 都能将文件路径转为资源定位标识,但它们的语义、行为和适用场景有本质区别,不能混用。
File.toURI():安全、标准、推荐的方式
toURI() 是 Java 5 引入的规范方法,它严格遵循 RFC 2396 和 RFC 3986,对路径中的特殊字符(如空格、中文、#、? 等)进行正确百分比编码,并确保生成的是合法的 file:// URI。它不抛出受检异常,且能跨平台兼容 Windows/Linux/macOS 的路径格式。
- Windows 下
new File("C:\my folder\测试.txt").toURI()返回file:///C:/my%20folder/%E6%B5%8B%E8%AF%95.txt - Linux/macOS 下
new File("/home/user/文件.txt").toURI()返回file:///home/user/%E6%96%87%E4%BB%B6.txt - 生成的 URI 可直接用于
ClassLoader.getResource(…)、Paths.get(uri)或Files.newInputStream(…)
File.toURL():遗留方法,存在编码与平台风险
toURL() 是早期 JDK 提供的方法,它不保证对路径做完整编码——尤其在含空格或非 ASCII 字符时,可能生成非法 URL(如 file:///C:/my folder/测试.txt),导致后续 url.openStream() 报 MalformedURLException 或读取失败。它还可能在 Windows 上漏掉盘符前的第三个斜杠(file:/C:/...),违反 file URL 规范。
- 该方法声明抛出
MalformedURLException,需强制 try-catch - 返回的 URL 对象不能直接传给
Paths.get()(会抛IllegalArgumentException) - 仅建议用于极老代码兼容,新项目应避免使用
实际转换 URI 的正确写法
若目标是获取可用于文件 I/O 的 URI,只用 file.toURI();若必须用 URL(例如某些旧 API 要求),应由 URI 安全构造:
- ✅ 推荐:
URI uri = file.toURI(); - ✅ 安全转 URL:
URL url = file.toURI().toURL();(先转 URI 再转 URL,规避编码问题) - ❌ 避免:
URL url = file.toURL();(不可靠)
注意 URI 与 URL 的根本区别
URI 是统一资源标识符,侧重“标识”;URL 是统一资源定位符,侧重“访问地址”。所有 URL 都是 URI,但并非所有 URI 都是 URL(比如 urn:isbn:039536341X 是 URI 但不是 URL)。file:// 形式既是 URI 也是 URL,但 File.toURI() 产出的是更严谨的抽象标识,而 File.toURL() 试图产出可操作地址却常失效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











