Java文件读写异常处理核心是分清责任与恢复策略:需区分受检异常(如FileNotFoundException、AccessDeniedException)并针对性处理,用try-with-resources自动关流,按场景封装语义化异常供上层决策。

Java 中处理文件读写异常,核心是分清“该谁处理”和“怎么恢复”,而不是一 catch 了事。
明确区分受检异常与业务意图
文件操作抛出的 IOException 及其子类(如 FileNotFoundException、SecurityException)都是受检异常,编译器强制你面对它们。不能忽略,也不该全塞进一个 catch (Exception e) 里糊弄过去。
- 遇到 FileNotFoundException:说明路径不对或文件真不存在——可主动创建父目录、提示用户检查路径,或走默认配置逻辑
- 捕获到 AccessDeniedException(IOException 子类):大概率是文件正被 Excel、记事本、杀毒软件占用——应提示“请关闭相关程序后重试”,而非重试十次
- 收到 DiskFullException(或写入时 IOException 提示 “No space left”):属于资源级失败,需记录日志并通知运维,不建议自动降级
用 try-with-resources 自动关流,杜绝资源泄漏
手动在 finally 里关流容易遗漏或出错。Java 7 起推荐使用 try-with-resources,只要实现了 AutoCloseable 的流(如 FileReader、BufferedWriter、PrintWriter),都会在块结束时自动调用 close(),哪怕发生异常也保证执行。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 正确写法:
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) { ... } - 错误写法:把多个不同生命周期的流塞进同一个 try-with-resources,比如把
FileChannel和FileLock一起管——FileLock不实现 AutoCloseable,必须显式release()
对锁冲突做协作式处理,不硬抢
多进程/多线程写同一文件时,OverlappingFileLockException 是正常信号,不是故障。重点不在“怎么抢到锁”,而在“怎么优雅等待或绕开”。
立即学习“Java免费学习笔记(深入)”;
- 用
channel.tryLock()替代channel.lock(),避免线程卡死 - 尝试 3 次,每次间隔 100ms;失败后抛出自定义异常(如
FileBusyException),让上层决定弹窗提示还是切临时路径 - 更优解:写操作先写入
xxx.tmp,再用Files.move(..., StandardCopyOption.ATOMIC_MOVE)原子替换原文件——彻底避开锁争用
按场景封装异常,让调用方能决策
不要让 UI 层或 Service 层面对原始 IOException。根据上下文包装成语义清晰的异常:
- 读取用户配置失败 → 抛
ConfigLoadException,附带“请检查 config.yaml 格式”提示 - 保存日志失败但不影响主流程 → 记录 warn 日志,不中断业务,后续异步补偿
- 导出报表时磁盘满 → 抛
ExportFailedException并携带剩余空间信息,前端可显示“磁盘不足,请清理至少 200MB”

















