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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:27:15