Java如何提取文件中两个指定字符串之间的内容?
问题解决与代码修正
核心问题分析
- 错误的方法调用:你代码中调用
result.get(i).getname()是错误的,因为result集合存储的是String类型的文件行,而非自定义的Model对象,String类不存在getname()方法。 - 潜在的匹配问题:原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
相关产品推荐
相关产品推荐

