read() 返回 -1 表示已读到文件末尾(eof),是正常结束信号而非错误;仅当 fileinputstream 读取位置到达末尾且无字节可读时返回,标准写法为 while ((b = fis.read()) != -1),配合 try-with-resources 自动关闭流。

read() 返回 -1 表示已读到文件末尾(EOF),这是正常结束信号,不是错误,无需抛异常或报错处理。
什么时候会返回 -1
当 FileInputStream 的内部读取位置已到达文件末尾,且没有更多字节可读时,read() 方法返回 -1。它只在“尝试读一个字节但失败(因无数据)”时才返回 -1,而不是每次调用都可能返回。
- 首次调用 read() 前文件为空 → 立即返回 -1
- 读完最后一个字节后再次调用 → 返回 -1
- 中间读取过程不会返回 -1,除非真正触达 EOF
标准循环读取写法(推荐)
用 while ((b = fis.read()) != -1) 是最常见、最安全的惯用写法,把判断和读取合并,避免多读一次或漏判:
int b;
while ((b = fis.read()) != -1) {
// b 是 0~255 范围内的有效字节值
System.out.write(b); // 或存入 buffer、处理等
}
// 循环结束,说明已读完,fis 已到 EOF
注意:不要写成 while (fis.read() != -1),那样会丢失第一个字节——因为每次循环都调用一次 read(),但没保存返回值。
配合 try-with-resources 自动关闭
确保流被正确释放,避免资源泄漏:
try (FileInputStream fis = new FileInputStream("data.txt")) {
int b;
while ((b = fis.read()) != -1) {
processByte(b);
}
} catch (IOException e) {
e.printStackTrace();
}
// fis 在这里自动 close(),无需手动调用
别把 -1 当异常处理
-1 是设计好的终止标识,不是 I/O 错误:
- 不要对 -1 打印警告日志或抛 RuntimeException
- 不要在 catch 块里处理它(它根本不会抛异常)
- 如果读到 -1 后还继续调用 read(),仍会持续返回 -1,不会阻塞或抛错
真正需要捕获的是 IOException(如文件不存在、权限不足、磁盘故障等),这些会抛异常,而非返回 -1。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











