Java I/O 类详解:Scanner、BufferedReader、StringTokenizer、PrintWriter、StreamTokenizer
在 Java 中处理输入输出时,不同类适用于不同场景。以下是核心类的功能解析及组合使用建议:
1. Scanner
功能:基于正则表达式的文本扫描器,支持逐行读取和类型解析。
特点:
- 简单易用,支持混合输入(数字、字符串等)。
- 性能较低,适合小规模数据(<10^5次输入)。
适用场景: - 初学者练习或小规模数据输入。
- 需要灵活解析混合类型数据的场景。
示例:
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
String s = sc.next();
2. BufferedReader
功能:缓冲字符输入流,支持按行读取。
特点:
- 高效读取大文本(>10^5次输入),性能比 Scanner 快 3-5 倍
- 需手动解析数据(如
split()
或StringTokenizer
)
适用场景: - 大规模数据输入(如算法竞赛)。
- 需要按行处理文本的场景。
示例:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
3. StringTokenizer
功能:将字符串拆分为标记(tokens)。
特点:
- 高效解析空格分隔的字符串,性能优于
split()
- 需配合
BufferedReader
使用。
适用场景: - 需要快速拆分字符串的场景(如数值输入)。
- 替代
split()
处理简单分隔符。
示例:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
4. PrintWriter
功能:格式化输出到字符流,支持自动刷新。
特点:
- 高效写入格式化内容(如数学公式、表格)。
- 需配合
BufferedWriter
提升性能
适用场景: - 大量输出(>10^5次写入)。
- 需要格式化输出(如保留小数点后两位)。
示例:
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
pw.printf("Sum: %.2f\n", total);