1.Reader 类概述
Reader是一个抽象类,用于读取字符流。与InputStream(字节流)不同,Reader专门处理字符(16位 Unicode 字符)。
public abstract class Reader implements Readable, Closeable2.主要子类
常用实现类:
FileReader- 读取文件字符流
StringReader- 从字符串读取
CharArrayReader- 从字符数组读取
InputStreamReader- 字节流到字符流的桥梁
BufferedReader- 带缓冲的读取器(最常用)
3.核心方法
基本读取方法:
// 读取单个字符 public int read() throws IOException // 读取到字符数组 public int read(char[] cbuf) throws IOException // 读取到字符数组的指定部分 public abstract int read(char[] cbuf, int off, int len) throws IOException // 跳过指定数量的字符 public long skip(long n) throws IOException // 检查是否支持标记 public boolean markSupported() // 标记当前位置 public void mark(int readAheadLimit) throws IOException // 重置到标记位置 public void reset() throws IOException // 关闭流 public abstract void close() throws IOException4.使用示例
示例 1:使用 FileReader
import java.io.FileReader; import java.io.IOException; public class ReaderExample { public static void main(String[] args) { try (FileReader reader = new FileReader("file.txt")) { int character; while ((character = reader.read()) != -1) { System.out.print((char) character); } } catch (IOException e) { e.printStackTrace(); } } }示例 2:使用 BufferedReader(推荐)
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class BufferedReaderExample { public static void main(String[] args) { try (BufferedReader reader = new BufferedReader( new FileReader("file.txt"))) { String line; while ((line = reader.readLine()) != null) { System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } } }示例 3:使用 StringReader
import java.io.StringReader; import java.io.IOException; public class StringReaderExample { public static void main(String[] args) { String data = "Hello, World!"; try (StringReader reader = new StringReader(data)) { char[] buffer = new char[5]; int charsRead; while ((charsRead = reader.read(buffer)) != -1) { System.out.println(new String(buffer, 0, charsRead)); } } catch (IOException e) { e.printStackTrace(); } } }5.使用模式
模式 1:传统的 try-catch-finally
Reader reader = null; try { reader = new FileReader("file.txt"); // 读取操作 } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } }模式 2:try-with-resources(Java 7+,推荐)
try (Reader reader = new FileReader("file.txt")) { // 自动关闭资源 // 读取操作 } catch (IOException e) { e.printStackTrace(); }6.最佳实践
总是使用缓冲:使用
BufferedReader包装其他 Reader 以提高性能BufferedReader bufferedReader = new BufferedReader(reader);指定字符编码:使用
InputStreamReader明确指定字符集Reader reader = new InputStreamReader( new FileInputStream("file.txt"), StandardCharsets.UTF_8 );使用 try-with-resources:确保资源正确关闭
批量读取:使用字符数组进行批量读取,而不是单个字符
char[] buffer = new char[1024]; int charsRead; while ((charsRead = reader.read(buffer)) != -1) { // 处理 buffer 中的数据 }
7.与 InputStream 的区别
特性 Reader(字符流) InputStream(字节流) 数据单位 字符(16位) 字节(8位) 编码处理 自动处理字符编码 不处理字符编码 主要用途 文本文件读取 二进制文件读取 典型实现 FileReader, StringReader FileInputStream, ByteArrayInputStream 8.常见应用场景
读取文本文件
处理用户输入
解析配置文件
读取网络数据(结合 InputStream)
字符串处理