java 中判断流读写结束(eof)的核心方法是检查读取方法的返回值,字节流通常返回 -1,字符流则返回 -1 或 null。

InputStream 的 read() 如何判定 EOF
在 Java 字节流中,InputStream 及其子类(如 FileInputStream、BufferedInputStream)通过 read() 方法返回 -1 来表示到达文件末尾。当调用 read() 且没有更多数据可读时,该方法会返回整数 -1;如果发生 I/O 错误,则会抛出 IOException。因此,标准的读取循环应持续调用 read(),直到返回值等于 -1 为止。需要注意的是,read(byte[] b) 批量读取方法在遇到 EOF 时返回实际读取的字节数(可能为 0),若返回 -1 则表示已到达末尾。

import java.io.FileInputStream;
import java.io.IOException;
public class ByteStreamExample {
public static void main(String[] args) throws IOException {
// 假设有一个包含 "AB" 的文件 test.txt
try (FileInputStream fis = new FileInputStream("test.txt")) {
int data;
while ((data = fis.read()) != -1) {
System.out.print((char) data);
}
}
}
}
预期输出:
A
B
Reader 的 read() 与 readLine() 的 EOF 处理
对于字符流,Reader 类(如 FileReader、BufferedReader)的判断逻辑略有不同。Reader.read() 同样在到达末尾时返回 -1。然而,更常用的 BufferedReader.readLine() 方法在遇到行尾时返回空字符串 ""(如果该行只有换行符),而在真正到达文件末尾且没有剩余内容时返回 null。因此,使用 BufferedReader 时,判断 EOF 的标准是检查 readLine() 是否返回 null。此外,Reader.read(char[] cbuf) 批量读取方法在 EOF 时返回 -1,这与字节流行为一致。
立即学习“Java免费学习笔记(深入)”;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class CharStreamExample {
public static void main(String[] args) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}
}
}
预期输出:
第一行内容
第二行内容
混合流中 read() 返回值的类型差异
在实际开发中,经常需要同时处理字节和字符流,此时需特别注意 read() 返回值的类型和含义。字节流的 read() 返回 int,其值范围是 0-255 表示有效字节,-1 表示 EOF。字符流的 read() 也返回 int,0-65535 表示有效 Unicode 码点,-1 表示 EOF。关键区别在于,字符流可能涉及编码转换,Reader 会自动处理字节到字符的解码,而 InputStream 仅处理原始字节。因此,在判断 EOF 时,两者都依赖 -1,但字符流在使用 readLine() 时需额外处理 null 返回值。若未正确处理 EOF,可能导致无限循环或数据截断。


















