java中用try-with-resources读写csv文件的核心是自动关闭实现autocloseable的资源;标准库适用于无特殊字符的简单csv,opencsv则能正确处理引号、换行等复杂场景,并支持跳过标题行等功能。

Java 中用 try-with-resources 读写 CSV 文件,核心是让实现了 AutoCloseable 的资源(如 BufferedReader、BufferedWriter、第三方 CSV 库的 reader/writer)自动关闭,避免手动 close() 和资源泄漏。
用标准库读 CSV(简单场景)
如果 CSV 格式简单(无引号、无换行、无逗号在字段内),可用 Files.lines() 或 BufferedReader 配合 try-with-resources:
- 用
Files.newBufferedReader()获取带 UTF-8 编码的BufferedReader - 每行用
String.split(",")粗略解析(注意:不处理带逗号或引号的字段) - 资源在 try 块结束时自动关闭
示例:
Path path = Paths.get("data.csv");
try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
String line;
while ((line = reader.readLine()) != null) {
String[] fields = line.split(",", -1); // -1 保留末尾空字段
System.out.println(Arrays.toString(fields));
}
} catch (IOException e) {
e.printStackTrace();
}
用 OpenCSV 写 CSV(推荐用于真实项目)
OpenCSV 是成熟轻量的第三方库,能正确处理引号、换行、转义等。它提供的 CsvWriter 和 CsvReader 都实现了 Closeable,可直接用于 try-with-resources:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- Maven 依赖:
com.opencsv:opencsv:5.7.1(注意版本兼容 Java 版本) - 写 CSV 时用
FileWriter包裹CsvWriter,确保编码为 UTF-8 - 每调用一次
writeNext()写一行,传入String[]
示例:
Path path = Paths.get("output.csv");
try (FileWriter fw = new FileWriter(path.toFile(), StandardCharsets.UTF_8);
CSVWriter writer = new CSVWriter(fw)) {
writer.writeNext(new String[]{"姓名", "城市", "备注"});
writer.writeNext(new String[]{"张三", "北京", "喜欢\"Java\""});
writer.writeNext(new String[]{"李四", "上海", "换\n行了"});
} catch (IOException e) {
e.printStackTrace();
}
用 OpenCSV 读 CSV(安全解析)
相比手动 split(),CsvReader 能正确识别被引号包裹的字段和内部逗号:
- 构造
CsvReader时传入InputStreamReader+StandardCharsets.UTF_8 - 用
readNext()逐行获取String[],返回null表示结束 - 支持设置分隔符、引号字符、跳过首行等(通过
CsvReaderBuilder)
示例(带 header 跳过):
Path path = Paths.get("data.csv");
try (Reader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
CSVReader csvReader = new CSVReaderBuilder(reader)
.withSkipLines(1) // 跳过标题行
.build()) {
String[] line;
while ((line = csvReader.readNext()) != null) {
if (line.length >= 3) {
System.out.printf("姓名:%s,城市:%s,备注:%s%n",
line[0], line[1], line[2]);
}
}
} catch (IOException e) {
e.printStackTrace();
}
注意事项和常见坑
使用 try-with-resources 处理 CSV 时需留意:
-
Files.lines()返回的流本身是AutoCloseable,但必须用try-with-resources包裹整个流,不能只包iterator() - OpenCSV 的
CsvWriter默认不加 BOM,如需 Excel 正确识别 UTF-8,可手动写 BOM:fw.write("\uFEFF"); - 不要在
try块内对资源对象做二次赋值(如reader = null),可能干扰自动关闭逻辑 - 多个资源并列声明时,关闭顺序与声明顺序相反(后声明的先关闭),一般无需干预
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










