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

如何将CSV文件中的信息加载并保存至List集合?

将CSV数据加载到List的解决方案

现有代码的问题

  • loadTextFile是静态方法,但characters是实例变量,静态方法无法直接访问它,需要调整方法设计
  • 仅打开了文件输入流,没有进行实际的读取、解析和数据存入List的操作
  • 使用FileInputStream字节流处理文本文件不够高效,建议用字符流(如BufferedReader)

方案1:Java原生API实现(无第三方库)

首先假设GameCharacter类的结构如下(根据你的实际字段调整):

public class GameCharacter {
    private int id;
    private String name;
    private int level;

    // 构造方法
    public GameCharacter(int id, String name, int level) {
        this.id = id;
        this.name = name;
        this.level = level;
    }

    // Getter和Setter(可选)
    // ...
}

修改后的加载方法,完成读取、解析并填充List:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class CharacterLoader {
    private List<GameCharacter> characters = new ArrayList<>();

    public void loadCsvFile(String csvFilePath) {
        // 使用try-with-resources自动关闭流,避免资源泄漏
        try (BufferedReader br = new BufferedReader(new FileReader(csvFilePath))) {
            String line;
            // 跳过CSV表头(如果你的CSV有表头的话)
            br.readLine();
            
            while ((line = br.readLine()) != null) {
                // 按逗号分割每行数据(注意:如果字段包含逗号且用引号包裹,这种简单分割会失效,需更复杂处理)
                String[] data = line.split(",");
                
                // 解析数据并创建GameCharacter对象
                int id = Integer.parseInt(data[0].trim());
                String name = data[1].trim();
                int level = Integer.parseInt(data[2].trim());
                
                characters.add(new GameCharacter(id, name, level));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 获取加载后的List
    public List<GameCharacter> getCharacters() {
        return characters;
    }
}

方案2:使用第三方库(OpenCSV,更可靠)

如果CSV中存在包含逗号的字段(如"Doe, John"),原生的split(",")会出错,推荐使用OpenCSV库来处理:

  1. 首先引入依赖(Maven):
<dependency>
    <groupId>com.opencsv</groupId>
    <artifactId>opencsv</artifactId>
    <version>5.6</version>
</dependency>
  1. 使用CsvToBean直接映射到GameCharacter类:
import com.opencsv.bean.CsvToBeanBuilder;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;

public class CharacterLoader {
    private List<GameCharacter> characters;

    public void loadCsvFile(String csvFilePath) {
        try {
            characters = new CsvToBeanBuilder<GameCharacter>(new FileReader(csvFilePath))
                    .withType(GameCharacter.class)
                    .withSkipLines(1) // 跳过表头
                    .build()
                    .parse();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public List<GameCharacter> getCharacters() {
        return characters;
    }
}

同时需要在GameCharacter类上添加注解,指定CSV列的映射:

import com.opencsv.bean.CsvBindByPosition;

public class GameCharacter {
    @CsvBindByPosition(position = 0)
    private int id;
    
    @CsvBindByPosition(position = 1)
    private String name;
    
    @CsvBindByPosition(position = 2)
    private int level;

    // 无参构造方法(OpenCSV需要)
    public GameCharacter() {}

    // 带参构造方法、Getter和Setter
    // ...
}

关键注意事项

  • 资源关闭:始终使用try-with-resources语法,确保文件流自动关闭,避免资源泄漏
  • 异常处理:除了FileNotFoundException,还要处理IOException和数据解析异常(如NumberFormatException)
  • CSV格式兼容:如果CSV包含特殊格式(如引号包裹的字段、转义字符),第三方库比原生方法更可靠

内容的提问来源于stack exchange,提问作者haruka kudo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:40:30