Java读取文件时提示‘Operation not permitted’错误的排查求助
解决Java读取文件时的"Operation not permitted"权限错误
首先明确:你遇到的java.io.FileNotFoundException里标注的Operation not permitted是文件系统权限问题,和你测试的.rtf、.txt文件格式完全无关——错误信息已经说明系统找到了文件,但你的Java进程没有读取它的权限。
错误原因分析
常见的触发场景(尤其是在macOS系统下):
- macOS隐私保护限制:当前macOS默认会严格限制应用访问桌面、文档等敏感目录,如果你是通过IDE(比如IntelliJ、Eclipse)或终端运行Java程序,系统可能没给这些应用授权访问桌面文件夹的权限。
- 文件本身的权限设置:目标文件的可读权限没有开放给运行Java程序的用户,比如文件仅对所有者开放读取,而你用其他用户身份运行程序。
- 父目录权限限制:即使文件本身有权限,它所在的桌面目录如果没有读取/执行权限,也会导致无法访问文件。
具体解决方法
1. 解除macOS隐私权限限制
打开「系统设置」→「隐私与安全性」→「文件和文件夹」,找到你用来运行Java程序的应用(比如「终端」「IntelliJ IDEA」),勾选「桌面」选项,然后重启该应用再测试。
2. 修改文件/目录的可读权限
打开终端,执行以下命令:
- 给目标文件添加全局可读权限:
chmod +r /Users/coryallen/Desktop/input.txt - 如果是桌面目录本身权限不足,添加读取和执行权限:
chmod +rx /Users/coryallen/Desktop - 你也可以用
ls -l /Users/coryallen/Desktop/input.txt查看文件的权限详情,比如输出类似-rw-r--r-- 1 coryallen staff ...,其中r代表可读权限,确保运行程序的用户对应位置有r权限。
3. 额外修复:你的代码逻辑小问题
虽然这不是当前权限错误的原因,但你的代码存在读取行丢失的问题:每次while条件里调用readLine()会读取一行,println里又调用一次readLine(),会跳过一行内容。修正后的代码如下(推荐用try-with-resources自动关闭流,避免资源泄漏):
List<String> fileContents = new ArrayList<>(); try (FileReader fReader = new FileReader(fileName); BufferedReader fBuff = new BufferedReader(fReader)) { String line; while((line = fBuff.readLine()) != null) { if(line.contains("name")) { System.out.println(line); fileContents.add(line); } } } catch (Exception e) { e.printStackTrace(); }
内容的提问来源于stack exchange,提问作者user16148657
相关产品推荐
相关产品推荐

