You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Java Stream截取.txt文件中特定行之前的数据?

Java Stream 读取.txt文件并处理“---”之前的所有行

方案一:Java 9+ 用 takeWhile 快速实现

takeWhile 是Java 9新增的Stream方法,能在遇到第一个不满足条件的元素时终止流,刚好适配“保留---之前所有行”的需求。

代码示例:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.charset.StandardCharsets;
import java.util.List;

public class FileHandler {
    public List<String> getLinesBeforeSeparator(String filePath) throws Exception {
        return Files.lines(Path.of(filePath), StandardCharsets.UTF_8)
                // 保留所有不是---的行,直到遇到第一个---时停止
                .takeWhile(line -> !"---".equals(line))
                .toList();
    }
}

方案二:Java 8 兼容方案(状态追踪)

如果项目基于Java 8,可通过AtomicBoolean追踪状态,结合filter实现需求:

代码示例:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;

public class FileHandler {
    public List<String> getLinesBeforeSeparator(String filePath) throws Exception {
        AtomicBoolean isBeforeSeparator = new AtomicBoolean(true);

        return Files.lines(Path.of(filePath), StandardCharsets.UTF_8)
                .filter(line -> {
                    if (isBeforeSeparator.get()) {
                        if ("---".equals(line)) {
                            // 遇到分隔线,标记状态为已越过
                            isBeforeSeparator.set(false);
                            return false; // 不保留分隔线本身
                        }
                        return true; // 保留分隔线前的行
                    }
                    // 已越过分隔线,过滤所有后续行
                    return false;
                })
                .collect(Collectors.toList());
    }
}

关键说明

  • 两种方案都会在第一个“---”行处停止处理,后续行不再参与流操作。
  • 代码中指定了UTF-8编码,需确保目标文件编码与之匹配,避免乱码。

内容的提问来源于stack exchange,提问作者BSLK11

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:01:07