如何将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库来处理:
- 首先引入依赖(Maven):
<dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.6</version> </dependency>
- 使用
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
相关产品推荐
相关产品推荐

