如何通过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
相关产品推荐
相关产品推荐

