You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS下文件存在且有权限仍触发FileNotFoundException的问题求助

JavaFX应用在macOS抛出FileNotFoundException,Windows正常的解决方法

问题分析

核心问题出在将URI字符串直接传入File构造函数。Java的File类在跨平台处理file:///格式的URI时逻辑不一致:

  • Windows系统能正确识别file:///开头的路径字符串
  • macOS系统下File会错误地将file:///解析为file:/(丢失一个斜杠),导致路径无效,因此file.exists()返回false,最终触发FileNotFoundException

你的代码中存在关键错误步骤:

String path = Paths.get(loadedFilePath).toUri().toString();
File file = new File(path); // 直接用URI字符串创建File是跨平台隐患

生成的标准URI是file:///Users/userName/Downloads/untitled%20folder/image.png,但macOS的File解析后变成了file:/Users/username/Downloads/untitled%20folder/image.png,路径格式错误直接导致找不到文件。

解决方案

无需将路径转成URI字符串再转回File,直接使用更可靠的方式处理:

方式一:直接使用Path转File(推荐)

JavaFX文件选择器获取的路径本身已合法,直接通过Path转File即可:

Path filePath = Paths.get(loadedFilePath);
com.drew.metadata.Metadata metadata = ImageMetadataReader.readMetadata(filePath.toFile());

方式二:通过URI对象创建File

如果必须使用URI,不要传字符串,先转为URI对象再实例化File:

URI fileUri = Paths.get(loadedFilePath).toUri();
File file = new File(fileUri);
com.drew.metadata.Metadata metadata = ImageMetadataReader.readMetadata(file);

补充说明

  • 你之前尝试的移除文件夹空格、设置0777权限无效,因为问题本质不是文件权限或空格编码,而是跨平台的路径格式解析错误
  • JavaFX文件选择器返回的路径可直接用于文件操作,无需额外转成URI字符串,多此一举反而引入跨平台问题

内容的提问来源于stack exchange,提问作者Alessandro Valentino

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:35:07