本文目录导读:

我来详细介绍Java字符流读取文本的几种常见方式:
使用FileReader(基础方式)
import java.io.FileReader;
import java.io.IOException;
public class FileReaderExample {
public static void main(String[] args) {
FileReader reader = null;
try {
// 创建FileReader对象
reader = new FileReader("test.txt");
// 逐个字符读取
int ch;
while ((ch = reader.read()) != -1) {
System.out.print((char) ch);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
使用BufferedReader(带缓冲的高效方式)
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class BufferedReaderExample {
public static void main(String[] args) {
// try-with-resources 自动关闭资源
try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
String line;
// 逐行读取
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
指定字符编码读取
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
public class EncodingReaderExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream("test.txt"),
StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
使用Files工具类(Java 7+)
import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;
public class FilesReadExample {
public static void main(String[] args) {
try {
// 读取所有行到List
List<String> lines = Files.readAllLines(Paths.get("test.txt"));
// 方法1:遍历行
for (String line : lines) {
System.out.println(line);
}
// 方法2:读取整个文件内容
String content = new String(Files.readAllBytes(Paths.get("test.txt")));
System.out.println(content);
// 方法3:使用流式处理(Java 8+)
Files.lines(Paths.get("test.txt"))
.filter(line -> !line.isEmpty())
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}
综合示例:读取并处理文件
import java.io.*;
import java.nio.file.*;
import java.util.stream.Stream;
public class AdvancedTextReader {
// 方法1:使用BufferedReader逐行读取
public static void readWithBufferedReader(String filePath) {
System.out.println("=== 使用BufferedReader ===");
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
int lineNum = 1;
while ((line = br.readLine()) != null) {
System.out.printf("第%d行: %s%n", lineNum++, line);
}
} catch (IOException e) {
System.err.println("读取文件失败: " + e.getMessage());
}
}
// 方法2:使用Files类读取(现代方式)
public static void readWithFilesAPI(String filePath) throws IOException {
System.out.println("=== 使用Files API ===");
// 读取所有行
Files.readAllLines(Paths.get(filePath))
.forEach(line -> System.out.println("内容: " + line));
}
// 方法3:使用Stream API(Java 8+)
public static void readWithStream(String filePath) {
System.out.println("=== 使用Stream API ===");
try (Stream<String> lines = Files.lines(Paths.get(filePath))) {
lines.map(String::toUpperCase) // 转换为大写
.filter(s -> s.contains("JAVA")) // 过滤包含JAVA的行
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
// 方法4:读取指定编码的文件
public static void readWithEncoding(String filePath) {
System.out.println("=== 指定编码读取 ===");
try (BufferedReader br = new BufferedReader(
new InputStreamReader(
new FileInputStream(filePath), "GBK"))) {
char[] buffer = new char[1024];
int charsRead;
StringBuilder content = new StringBuilder();
while ((charsRead = br.read(buffer)) != -1) {
content.append(buffer, 0, charsRead);
}
System.out.println("文件内容长度: " + content.length() + " 字符");
System.out.println(content.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String filePath = "example.txt";
// 创建测试文件
try {
Files.write(Paths.get(filePath),
"Hello Java!".getBytes());
// 调用不同方法
readWithBufferedReader(filePath);
readWithFilesAPI(filePath);
readWithStream(filePath);
readWithEncoding(filePath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
性能对比和建议
| 方法 | 适用场景 | 特点 |
|---|---|---|
| FileReader | 小文件、简单需求 | 基础,效率低 |
| BufferedReader | 大文件、需要缓冲 | 高效,推荐使用 |
| InputStreamReader | 需要指定编码 | 灵活,可控制编码 |
| Files.readAllLines | 小文件、快速读取 | 简洁,Java 7+ |
| Files.lines | 大文件、流式处理 | 懒加载,Java 8+ |
最佳实践建议:
- 一般文本文件推荐使用
BufferedReader - 需要指定编码时使用
InputStreamReader包装 - Java 8+ 可以使用
Files.lines()配合Stream API - 始终在try-with-resources中处理流资源
- 大文件避免使用
readAllLines()或readAllBytes()
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播