Working with CSV in Java: Library Overview and Examples
CSV (Comma-Separated Values) is one of the most common formats for exchanging tabular data. Despite its apparent simplicity, manual CSV parsing in Java can lead to errors due to quote escaping, nested commas, and different encodings. In this article, we will look at three main approaches: using OpenCSV, Apache Commons CSV, and the standard java.util.Scanner.
1. OpenCSV — A Flexible and Popular Library
OpenCSV is a lightweight open-source library that supports reading and writing CSV, TSV, and other delimiters. It automatically handles escaping, quotes, and multi-line fields.
Adding Dependency (Maven)
<dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.9</version></dependency>Example: Reading CSV into a List of Objects
import com.opencsv.CSVReader;import com.opencsv.bean.CsvToBean;import com.opencsv.bean.HeaderColumnNameMappingStrategy;import java.io.FileReader;import java.util.List;
public class OpenCSVExample { public static void main(String[] args) throws Exception { try (FileReader reader = new FileReader("users.csv")) { // Manual parsing CSVReader csvReader = new CSVReader(reader); String[] line; while ((line = csvReader.readNext()) != null) { System.out.println("Name: " + line[0] + ", Email: " + line[1]); } } }}Example: Mapping to a Java Bean
public class User { private String name; private String email; // getters and setters}
// Reading with mappingtry (FileReader reader = new FileReader("users.csv")) { HeaderColumnNameMappingStrategy<User> strategy = new HeaderColumnNameMappingStrategy<>(); strategy.setType(User.class);
CsvToBean<User> csvToBean = new CsvToBeanBuilder<User>(reader) .withMappingStrategy(strategy) .build();
List<User> users = csvToBean.parse();}2. Apache Commons CSV — The Apache Standard
Apache Commons CSV is part of the Apache Commons ecosystem. It provides ready-made formats (RFC 4180, Excel, MySQL) and streaming processing.
Adding Dependency (Maven)
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.11.0</version></dependency>Example: Reading with Headers
import org.apache.commons.csv.CSVFormat;import org.apache.commons.csv.CSVParser;import org.apache.commons.csv.CSVRecord;import java.io.FileReader;import java.io.Reader;
public class CommonsCSVExample { public static void main(String[] args) throws Exception { try (Reader reader = new FileReader("data.csv"); CSVParser parser = CSVFormat.DEFAULT .withFirstRecordAsHeader() .parse(reader)) {
for (CSVRecord record : parser) { String id = record.get("ID"); String value = record.get("Value"); System.out.println(id + " -> " + value); } } }}Writing CSV
import org.apache.commons.csv.CSVFormat;import org.apache.commons.csv.CSVPrinter;import java.io.FileWriter;import java.io.Writer;
try (Writer writer = new FileWriter("output.csv"); CSVPrinter printer = CSVFormat.DEFAULT .withHeader("Name", "Age") .print(writer)) {
printer.printRecord("Alice", 30); printer.printRecord("Bob", 25);}