reader是java字符输入流的抽象基类,本质通过字符流自动处理编码转换,需用inputstreamreader等子类实现;推荐inputstreamreader+bufferedreader组合读utf-8文件,并用try-with-resources管理资源。

Java 中用 Reader 读取字符,本质是使用**字符流**处理文本数据,它自动处理字符编码转换,比直接用字节流(如 InputStream)更安全、更便捷。
Reader 是字符输入流的抽象基类
Reader 本身不能直接实例化,需使用其子类,常见有:
-
FileReader:从文件读取字符(默认使用平台默认编码,不推荐用于跨平台场景) -
InputStreamReader:桥接字节流与字符流,可指定编码(如"UTF-8"),最常用也最灵活 -
BufferedReader:包装其他Reader,提供高效读行(readLine())和缓冲能力
推荐写法:用 InputStreamReader + BufferedReader 读文件
这是兼顾编码可控性与性能的主流方式。例如读取 UTF-8 编码的文本文件:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
try (InputStream is = new FileInputStream("data.txt");
InputStreamReader isr = new InputStreamReader(is, "UTF-8");
BufferedReader br = new BufferedReader(isr)) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
说明:
– 显式指定 "UTF-8" 避免乱码;
– 使用 try-with-resources 自动关闭所有资源;
– BufferedReader 的 readLine() 按行读取,不带换行符。
注意别踩的坑
- 不要直接用 FileReader 处理非默认编码文件:它不接受编码参数,依赖系统默认编码(Windows 常为 GBK,Linux/macOS 多为 UTF-8),极易乱码
-
read() 返回 int,不是 char:返回的是 Unicode 码点(0–65535),-1 表示流末尾;若强转为
char要小心高位截断 -
字符流 ≠ 字节流:不能把
FileInputStream强转成Reader;必须通过InputStreamReader转换
简单读取单个字符或字符串的快捷方式
如果只是小量读取,也可用 InputStreamReader 直接读:
try (InputStreamReader isr = new InputStreamReader(
new FileInputStream("hello.txt"), "UTF-8")) {
int ch;
while ((ch = isr.read()) != -1) {
System.out.print((char) ch); // 输出每个字符
}
}
或者一次性读到字符串(适合小文件):
String content = Files.readString(Paths.get("data.txt"), StandardCharsets.UTF_8);
(Java 11+ 提供,底层仍基于字符流,简洁安全)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










