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
相关产品推荐
相关产品推荐

