400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件

文章目录

  • [400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件](#400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件)
    • [1️⃣ 逐行读取文本文件](#1️⃣ 逐行读取文本文件)
    • [2️⃣ 使用 `Java SE 8+` 的 `Stream API`](#2️⃣ 使用 Java SE 8+Stream API)
    • 3️⃣总结

400. Java 文件操作基础 - 使用 Buffered Stream I/O 读取文本文件

在 Java 中,Files.newBufferedReader(Path, Charset) 方法可以 高效地打开文件进行读取 ,返回一个 BufferedReader 对象。这个对象可以让你逐行读取文本文件,避免一次性读取整个文件带来的性能问题。


1️⃣ 逐行读取文本文件

BufferedReader 提供了 readLine() 方法,可以逐行读取文件内容。

示例代码(Java SE 7+):

java 复制代码
import java.nio.file.*;
import java.io.BufferedReader;
import java.io.IOException;

public class LineCountExample {
    public static void main(String[] args) {
        Path path = Paths.get("file.txt");
        long count = 0L;

        try (BufferedReader reader = Files.newBufferedReader(path)) {
            String line = reader.readLine();
            while (line != null) {
                count++;
                line = reader.readLine();
            }
        } catch (IOException e) {
            System.err.println("读取文件异常: " + e.getMessage());
        }

        System.out.println("文件行数 = " + count);
    }
}

💡 注意点:

  • readLine() 返回的字符串 不包含换行符
  • 当到达文件末尾时,readLine() 返回 null
  • 使用 try-with-resources 自动关闭 BufferedReader,避免资源泄漏。

2️⃣ 使用 Java SE 8+Stream API

从 Java SE 8 开始,BufferedReader 提供了 lines() 方法,可以将文件的每一行转换成 Stream,方便使用 Stream API 进行处理,比如统计行数、过滤、映射等。

示例代码:

java 复制代码
import java.nio.file.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.stream.Stream;

public class LineCountStreamExample {
    public static void main(String[] args) {
        Path path = Paths.get("file.txt");

        try (BufferedReader reader = Files.newBufferedReader(path);
             Stream<String> lines = reader.lines()) {

            long count = lines.count();
            System.out.println("文件行数 = " + count);
        } catch (IOException e) {
            System.err.println("读取文件异常: " + e.getMessage());
        }
    }
}

✅ 优点:

  • 代码更加简洁
  • 可以直接利用 Stream API 进行复杂处理
  • Stream 继承自 AutoCloseable,配合 try-with-resources 可以自动关闭流

3️⃣总结

  1. 演示逐行读取与 Stream 读取的区别

    • readLine() 适合简单逐行读取
    • lines() 适合复杂数据处理
  2. 展示 Stream 的处理能力

    • 例如统计包含特定关键字的行数:
    java 复制代码
    long keywordCount = reader.lines()
                              .filter(l -> l.contains("Java"))
                              .count();
    System.out.println("包含 'Java' 的行数 = " + keywordCount);
  3. 强调资源管理

    • try-with-resources 是最佳实践,保证文件和流被正确关闭
相关推荐
Fox爱分享1 小时前
字节二面:10亿数据毫秒级查手机尾号后4位,答不出“异构索引”直接挂?
java·后端·面试
6190083361 小时前
win idea 控制台中文乱码
java·ide·intellij-idea
折哥的程序人生 · 物流技术专研1 小时前
《Java面试85题图解版(二)》进阶深化上篇:并发编程 + JVM
java·开发语言·后端·面试
abcnull1 小时前
用ASM做精准测试(Java)
java·jar·asm·字节码·精准测试
2501_931803751 小时前
Go:一门为解决C语言痛点而生的现代语言
c语言·开发语言·golang
用户8356290780511 小时前
使用 Python 自动创建 Excel 折线图
后端·python
@杰克成2 小时前
Java学习26
java·学习·idea
geovindu2 小时前
go: Interpreter Pattern
开发语言·设计模式·golang·解释器模式
小白学大数据2 小时前
面向大规模爬取:Python 全站链接爬虫优化(过滤 + 断点续爬)
开发语言·爬虫·python