Working with CSV in Java: OpenCSV and Apache Commons CSV
CSV (Comma-Separated Values) is one of the most common formats for storing and exchanging tabular data. Java does not have a built-in library for convenient CSV handling (only manual parsing via BufferedReader), so developers use third-party tools. In this article, we will look at two popular libraries: OpenCSV and Apache Commons CSV. You will learn how to read, write, and process CSV files with code examples.
1. OpenCSV: Lightweight Parsing and Annotations
OpenCSV is a simple and efficient library for working with CSV. It supports line-by-line reading, mapping to Java objects (via @CsvBindByName annotations), as well as data writing.
Adding Dependency (Maven)
<dependency> <groupId>com.opencsv</groupId> <artifactId>opencsv</artifactId> <version>5.9</version></dependency>Reading CSV into a List of Strings
import com.opencsv.CSVReader;import java.io.FileReader;import java.util.List;
public class OpenCsvExample { public static void main(String[] args) throws Exception { try (CSVReader reader = new CSVReader(new FileReader("data.csv"))) { List<String[]> rows = reader.readAll(); for (String[] row : rows) { System.out.println(String.join(" | ", row)); } } }}Mapping to a Java Object
import com.opencsv.bean.CsvBindByName;import com.opencsv.bean.CsvToBean;import com.opencsv.bean.CsvToBeanBuilder;import java.io.FileReader;import java.util.List;
public class User { @CsvBindByName(column = "name") private String name;
@CsvBindByName(column = "email") private String email;
// getters and setters}
// Readingtry (FileReader reader = new FileReader("users.csv")) { CsvToBean<User> csvToBean = new CsvToBeanBuilder<User>(reader) .withType(User.class) .withIgnoreLeadingWhiteSpace(true) .build(); List<User> users = csvToBean.parse(); users.forEach(u -> System.out.println(u.getName() + " - " + u.getEmail()));}Writing CSV
import com.opencsv.CSVWriter;import java.io.FileWriter;
try (CSVWriter writer = new CSVWriter(new FileWriter("output.csv"))) { String[] header = {"Name", "Age", "City"}; writer.writeNext(header); writer.writeNext(new String[]{"Alice", "30", "Moscow"}); writer.writeNext(new String[]{"Bob", "25", "SPb"});}2. Apache Commons CSV: Flexibility and Performance
Apache Commons CSV is part of the Apache Commons ecosystem. It features high performance, support for different formats (CSV, TSV, Excel), and customizable delimiters.
Adding Dependency (Maven)
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-csv</artifactId> <version>1.11.0</version></dependency>Reading CSV 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;
try (Reader in = new FileReader("data.csv"); CSVParser parser = CSVFormat.DEFAULT .withFirstRecordAsHeader() .parse(in)) { for (CSVRecord record : parser) { String name = record.get("name"); String email = record.get("email"); System.out.println(name + " : " + email); }}Writing CSV with Custom Delimiter
import org.apache.commons.csv.CSVFormat;import org.apache.commons.csv.CSVPrinter;import java.io.FileWriter;import