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

Java如何提取文件中两个指定字符串之间的内容?

问题解决与代码修正

核心问题分析

  1. 错误的方法调用:你代码中调用result.get(i).getname()是错误的,因为result集合存储的是String类型的文件行,而非自定义的Model对象,String类不存在getname()方法。
  2. 潜在的匹配问题:原Stream逻辑本身可行,但如果文件行存在前后空格(比如示例中"Iron "末尾的空格),会导致equals匹配失效,需要先对每行做 trim 处理。

修正后的代码(直接提取并打印字符串)

private static void loadRoom(String fileName) {
    List<String> result = new ArrayList<>();
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
        result = reader.lines()
                // 去除每行前后空格,避免匹配失败
                .map(String::trim)
                // 跳过所有"Room 1"之前的行
                .dropWhile(line -> !line.equals("Room 1"))
                // 跳过"Room 1"本身
                .skip(1)
                // 提取直到遇到"Room_end"的所有行(不包含"Room_end")
                .takeWhile(line -> !line.equals("Room_end"))
                .collect(Collectors.toList());
    } catch (IOException ie) {
        System.err.println("读取文件失败: " + fileName + ", 错误信息: " + ie.getMessage());
        ie.printStackTrace();
    }
    // 直接打印提取到的内容
    result.forEach(System.out::println);
}

若需转换为Model对象的版本

如果要把提取的字符串封装到自定义的Model类中,可以在Stream中添加映射逻辑:

private static void loadRoom(String fileName) {
    List<Model> modelList = new ArrayList<>();
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) {
        modelList = reader.lines()
                .map(String::trim)
                .dropWhile(line -> !line.equals("Room 1"))
                .skip(1)
                .takeWhile(line -> !line.equals("Room_end"))
                // 将每行字符串转换为Model对象
                .map(line -> {
                    Model model = new Model();
                    model.setName(line);
                    return model;
                })
                .collect(Collectors.toList());
    } catch (IOException ie) {
        System.err.println("读取文件失败: " + fileName + ", 错误信息: " + ie.getMessage());
        ie.printStackTrace();
    }
    // 通过Model的getName()方法打印内容
    modelList.forEach(model -> System.out.println(model.getName()));
}

class Model {
    private String name;
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
}

说明

  • 方法名改为符合Java规范的小驼峰命名loadRoom,返回值调整为void(原方法无有效返回内容)。
  • 增加map(String::trim)确保行内容的匹配不受前后空格影响。
  • 使用forEach替代传统for循环,代码更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 06:54:22