Java如何将文件读取的字符串映射到指定自定义数据结构
问题修复方案
你当前代码输出对象内存地址格式的结果,核心是三个问题:Scanner流读取逻辑错误、Data对象未赋值也没重写toString方法、main方法存在变量名/调用逻辑错误,按下面步骤修改即可。
1. 修正Data数据模型
现有Data类只有私有字段,没有赋值入口,也没有自定义字符串输出规则,默认打印就是类名@内存哈希值的格式,改成如下代码:
public class Data { private String id; private String code; // 新增构造方法方便赋值 public Data(String id, String code) { this.id = id; this.code = code; } // 重写toString,定义单个Data对象的打印格式 @Override public String toString() { return id + " " + code; } }
2. 修正FileProcess文件读取逻辑
原代码中Scanner未正确初始化,读行逻辑只在循环外执行一次会导致无限循环读取第一行,且创建Data对象时没有传入提取到的id、code,还存在类名大小写错误(new data()需改为new Data()),修正后代码:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.io.InputStream; public class FileProcess { public List<Data> process(InputStream inputStream) throws IOException { List<Data> result = new ArrayList<>(); // 正确初始化Scanner,通过try-with-resources自动关闭流 try(Scanner sc = new Scanner(inputStream)) { // 循环判断是否存在下一行,存在则读取 while (sc.hasNextLine()) { String line = sc.nextLine(); // 跳过空行避免索引越界 if (line.isBlank()) continue; // 按位置截取id和code,适配示例中每行前两个5位字段、空格分隔的格式 String id = line.substring(0, 5); String code = line.substring(6, 11); // 传入提取值创建Data对象,加入结果集 result.add(new Data(id, code)); } } return result; } }
3. 修正main方法调用逻辑
原main方法存在变量名拼写错误(inputStream写成input)、重复调用process方法、类型不匹配赋值的问题,修正后代码:
import java.io.FileInputStream; import java.io.InputStream; import java.util.List; public class ProcessorApplication { // 替换为实际的txt文件路径 private String inputPath = "你的文件存储路径"; public static void main(String[] args) { ProcessorApplication processorApplication = new ProcessorApplication(); try (InputStream inputStream = new FileInputStream(processorApplication.inputPath)) { FileProcess fileProcess = new FileProcess(); List<Data> dataList = fileProcess.process(inputStream); // 打印预期的表头 System.out.println(" line 1 line2"); System.out.println(" id code id code"); // 直接打印结果集,因Data重写了toString,会输出目标格式 System.out.println(dataList); } catch(IOException e) { System.out.println("文件读取错误"); e.printStackTrace(); } } }
运行效果
修改后输出将符合预期:
line 1 line2 id code id code [00001 48592, 00002 48372, ....]
提示:如果txt文件中存在长度不足11位的行,硬编码substring索引会报越界错误,更稳妥的提取方式是按空格分割行内容:
String[] parts = line.split("\\s+");,再取parts[0]作为id、parts[1]作为code,不需要硬编码位置索引。
内容的提问来源于stack exchange,提问作者user16681822
相关产品推荐
相关产品推荐

