如何在Java中提取文本文件中所有Message的Block 4内容?
解决方案
原代码仅通过单次indexOf方法定位第一个"Block 4"和"Block 5"的位置,因此只能提取第一条Message的Block4内容。要提取所有Message的Block4内容,需要通过循环迭代反复查找并提取,直到没有更多"Block 4"为止。
以下是修改后的完整代码:
import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class BlockParser { public static void main(String[] args) throws IOException { String filePath = "C:\\Users\\abc\\Desktop\\reportTest5.txt"; String content = null; try { // 读取文件内容 content = readFile(filePath); // 解析文件并获取所有Block4内容 List<AlphabetSpellings> block4List = parseFile(content); // 验证提取结果 for (AlphabetSpellings item : block4List) { System.out.println("提取到的Block4内容:\n" + item.getContent()); } } catch (IOException e) { e.printStackTrace(); } } public static String readFile(String path) throws IOException { BufferedReader reader = new BufferedReader(new FileReader(new File(path))); return reader.lines().collect(Collectors.joining(System.lineSeparator())); } private static List<AlphabetSpellings> parseFile(String fileContent) { List<AlphabetSpellings> block4List = new ArrayList<>(); int startIndex = 0; final String block4Marker = "Block 4"; final String block5Marker = "Block 5"; int block4Length = block4Marker.length(); while (true) { // 查找下一个"Block 4"的起始位置 int block4Start = fileContent.indexOf(block4Marker, startIndex); if (block4Start == -1) { // 无更多Block4,退出循环 break; } // 定位Block4内容的起始点(跳过"Block 4"本身) int contentStart = block4Start + block4Length; // 查找对应"Block 5"的起始位置 int block5Start = fileContent.indexOf(block5Marker, contentStart); String block4Content; if (block5Start == -1) { // 找不到Block5时,提取到文件末尾 block4Content = fileContent.substring(contentStart).trim(); } else { // 提取Block4到Block5之间的内容 block4Content = fileContent.substring(contentStart, block5Start).trim(); } // 将提取的内容加入列表 block4List.add(new AlphabetSpellings(block4Content)); // 更新下一次查找的起始位置,避免重复提取 startIndex = block5Start != -1 ? block5Start : fileContent.length(); } return block4List; } // 假设AlphabetSpellings类的基础结构 static class AlphabetSpellings { private String content; public AlphabetSpellings(String content) { this.content = content; } public String getContent() { return content; } } }
关键改动说明:
- 用循环迭代替代单次查找,每次提取后更新起始位置,确保遍历所有"Block 4"
- 处理边界场景:当最后一个Block4后无Block5时,自动提取到文件末尾
- 修复原代码返回
null的问题,实际将所有提取结果封装到列表中返回 - 添加结果验证代码,方便查看所有提取到的内容
内容的提问来源于stack exchange,提问作者Waseem
相关产品推荐
相关产品推荐

