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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:05:23