
本文介绍如何高效、安全地将 CSV 文件的每一行文本读入 ArrayList,并给出现代 Java 推荐的实现方式(基于 try-with-resources 和 BufferedReader),避免 Scanner 的异常陷阱,为后续按行解析(如统计交易类型)提供可靠数据基础。
本文介绍如何高效、安全地将 csv 文件的每一行文本读入 arraylist
在处理结构化文本文件(如含信用卡交易记录的 visadata.csv)时,首要任务是将原始数据逐行加载到内存中。虽然问题中尝试使用 Scanner 配合 nextLine(),但其控制逻辑存在明显缺陷:依赖 NullPointerException 或 NoSuchElementException 判断文件结束既不规范也不可靠(NullPointerException 通常源于未初始化对象,而非文件读取终止);同时缺少资源自动关闭机制,易引发文件句柄泄漏。
推荐采用 BufferedReader + try-with-resources 的标准做法,代码简洁、健壮且符合 Java 最佳实践:
import java.io.*;
import java.util.*;
public static List<string> readCsvLines(String filePath) {
List<string> lines = new ArrayList();
try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = reader.readLine()) != null) {
lines.add(line.trim()); // 可选:去除首尾空白,提升后续解析鲁棒性
}
} catch (FileNotFoundException e) {
System.err.println("错误:找不到文件 '" + filePath + "'");
throw new RuntimeException(e);
} catch (IOException e) {
System.err.println("错误:读取文件时发生 I/O 异常");
throw new RuntimeException(e);
}
return lines;
}</string></string>
调用该方法后,即可将返回的 List
public static void main(String[] args) {
String csvPath = "visadata.csv";
List<string> csvLines = readCsvLines(csvPath);
System.out.println("共加载 " + csvLines.size() + " 行交易数据");
// 传入 getTokens 进行 Token 解析(例如统计 debit/credit)
getTokens(csvLines);
}
// 示例:getTokens 方法签名建议改为接收 List<string>
public static void getTokens(List<string> lines) {
int total = 0, debitCount = 0, creditCount = 0;
for (String line : lines) {
if (line.isEmpty()) continue;
// 使用 StringTokenizer 或更推荐的 String.split(",") 解析字段
String[] fields = line.split(",", -1); // -1 保留空字段
if (fields.length >= 3 && fields[2].trim().equalsIgnoreCase("debit")) {
debitCount++;
} else if (fields.length >= 3 && fields[2].trim().equalsIgnoreCase("credit")) {
creditCount++;
}
total++;
}
System.out.printf("总计 %d 笔交易:借记 %d 笔,贷记 %d 笔%n", total, debitCount, creditCount);
}</string></string></string>
⚠️ 注意事项:
- 避免 StringTokenizer:该类已过时,官方文档明确建议使用 String.split() 或 java.util.Scanner(针对单行);对于 CSV,更推荐专用库(如 OpenCSV)处理引号、转义等复杂场景;
- 编码问题:若 CSV 含中文或特殊字符,请显式指定编码(如 new InputStreamReader(new FileInputStream(filePath), StandardCharsets.UTF_8));
- 空行与注释:生产环境建议跳过空行或以 # 开头的注释行,增强健壮性;
- 内存考量:超大文件应改用流式处理(如逐行解析+聚合统计),而非全量加载至 ArrayList。
综上,使用 BufferedReader 是读取 CSV 行数据最直接、高效且可维护的方式——它语义清晰、异常可控、资源安全,为后续业务逻辑(如交易分类统计)奠定坚实基础。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











