在 java 中,bufferedreader 的 readline() 方法用于从字符输入流中读取一行文本。要使用它,你需要将字节流(如 fileinputstream)包装在 inputstreamreader 中,再进一步包装到 bufferedreader 里,并指定编码格式。调用 readline() 会返回一个 string,当到达文件末尾时返回 null。

如何正确包装字节流以支持 readLine?
必须通过 InputStreamReader 作为桥梁,将字节流转换为字符流,因为 BufferedReader 只能处理字符流。直接传入字节流会导致编译错误。关键步骤是创建 InputStreamReader 实例时指定字符集(如 UTF-8),然后将其传给 BufferedReader 构造函数。

import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
// 假设有一个名为 test.txt 的文件,内容为 "Hello\nWorld"
String filePath = "test.txt";
try (FileInputStream fis = new FileInputStream(filePath);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println("Read: " + line);
}
}
}
}上述代码展示了标准的包装链:FileInputStream -> InputStreamReader -> BufferedReader。try-with-resources 确保流在使用后自动关闭。运行结果将打印两行:"Read: Hello" 和 "Read: World"。
立即学习“Java免费学习笔记(深入)”;
readLine() 在不同编码下的行为差异是什么?
readLine() 的行为依赖于底层 InputStreamReader 使用的字符编码。如果编码设置错误(例如文件是 GBK 但指定为 UTF-8),读取到的字符串会出现乱码,甚至可能因非法字节序列导致异常或截断。此外,readLine() 识别的行终止符包括 \n、\r 或 \r\n,这些会被丢弃,不会包含在返回的字符串中。

import java.io.*;
public class EncodingTest {
public static void main(String[] args) throws IOException {
String content = "中文测试\nEnglish Test";
String fileGBK = "test_gbk.txt";
String fileUTF8 = "test_utf8.txt";
// 写入 GBK 编码文件
try (OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(fileGBK), "GBK");
BufferedWriter bw = new BufferedWriter(osw)) {
bw.write(content);
}
// 用错误的 UTF-8 解码 GBK 文件
try (FileInputStream fis = new FileInputStream(fileGBK);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(isr)) {
String line = br.readLine();
System.out.println("Decoded with UTF-8 from GBK file: " + line);
}
}
}此示例演示了编码不匹配的后果。当用 UTF-8 解码 GBK 编码的文件时,readLine() 可能返回乱码字符串或抛出 MalformedInputException(取决于 JDK 版本和配置)。正确的做法是确保 InputStreamReader 的编码与文件实际编码一致。对于纯 ASCII 内容,编码差异影响较小,但对于多字节字符(如中文),编码必须精确匹配。
readLine() 遇到空行或特殊字符时会返回什么?
当 BufferedReader 遇到连续两个换行符(即空行)时,readLine() 会返回一个空字符串 "",而不是 null。null 仅在真正到达流末尾时返回。如果行中包含特殊字符(如制表符 \t 或 Unicode 字符),它们会被原样保留在返回的字符串中,除非编码转换过程中发生错误。因此,检查行内容是否为空应使用 line.isEmpty() 或 line.equals(""),而非判断 null。


















