Java文件读写需显式处理IOException(检查型异常),推荐用try-with-resources自动管理资源,优先捕获FileNotFoundException等具体子类,Files工具类方法建议直接throws,避免Scanner误用、手动close及空catch等常见错误。

Java 基础学习中处理文件读写时,IOException 必须显式捕获或声明,因为它属于检查型异常(checked exception),编译器强制要求你处理——不能忽略,也不能只靠运行时发现。
用 try-with-resources 自动管理资源
这是现代 Java(JDK 7+)的标准写法,既能自动关闭流、避免资源泄漏,又让异常处理更清晰:
- 所有实现了
AutoCloseable的流类(如FileReader、BufferedReader、FileOutputStream)都支持 - 即使
readLine()或write()抛出异常,括号内的资源仍会被自动关闭 - 如果关闭过程本身也抛出 IOException(比如磁盘满导致 flush 失败),它会被作为 suppressed 异常附加到主异常上,可用
e.getSuppressed()查看
示例:
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
System.err.println("读取失败:" + e.getMessage());
}
优先捕获具体子类异常
FileNotFoundException 是 IOException 的子类,代表“文件不存在”这一明确场景。先捕获它,再捕获通用 IOException,能让你的错误提示更精准、逻辑更可控:
- 用户看到“文件未找到,请检查路径”比“IO异常”更容易理解
- 某些业务场景下,文件不存在可默认创建,而权限不足则需人工干预
- 注意:不要把
catch (IOException e)放在FileNotFoundException前面,否则子类会被父类提前捕获
示例:
try (FileInputStream fis = new FileInputStream("config.properties")) {// 处理字节流
} catch (FileNotFoundException e) {
System.out.println("配置文件缺失,将使用默认设置");
} catch (IOException e) {
System.out.println("读取配置时发生未知IO错误:" + e);
}
Files 工具类建议直接 throws
像 Files.readAllLines()、Files.write() 这类 NIO.2 方法,异常语义更细(如 NoSuchFileException、AccessDeniedException),但方法签名本身已声明 throws IOException。初学阶段不必在内部硬吞,推荐向上抛出:
- 减少嵌套 try-catch,代码更干净
- 让调用方决定是重试、降级还是提示用户
- 若确需处理,建议前置校验(如
Files.exists(path))而非依赖异常分支判断
示例(方法签名声明):
public Listreturn Files.readAllLines(Paths.get(path));
}
别踩这些常见坑
新手容易忽略但后果明显的点:
-
Scanner读文件不抛IOException,它把底层 IO 错误转成InputMismatchException或静默跳过——别误以为“没异常=读成功” - 手动写
fis.close()很危险:close() 本身可能再抛IOException,且容易遗漏(尤其在 return 或 break 后) - 用
catch (Exception e)或空 catch 吞掉异常,等于放弃排查线索;至少打印堆栈或记录日志 - 嵌套流(如
new BufferedReader(new InputStreamReader(new FileInputStream(...))))只要最外层在 try-with-resources 括号里,内层都会被自动关闭
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











