Write/Read CSV Files in Java Example
In this example we are going to demonstrate how to Write/Read CSV files. CSV (Comma Separated Values) is a file format for data storage which looks like a text file, contains information which is organized with one record on each line and each field is separated by comma.
A CSV file is primarily used in database migration process where we can transport data between two databases of different formats through a computer program.
There are many ways to write and read CSV files in java where we can use a native java or an open source 3rd Party tool like OpenCSV, Apache Commons CSV and Super CSV.
So, Let’s see how we can write and read a simple CSV file using the native java code.
1. POJO to map the CSV File:
We create this simple POJO to contain the student data like id
, firstName
, lastName
, gender
and age
.
Student.java:
package com.jcg; /** * @author ashraf * */ public class Student { private long id; private String firstName; private String lastName; private String gender; private int age; /** * @param id * @param firstName * @param lastName * @param gender * @param age */ public Student(long id, String firstName, String lastName, String gender, int age) { super(); this.id = id; this.firstName = firstName; this.lastName = lastName; this.gender = gender; this.age = age; } /** * @return the id */ public long getId() { return id; } /** * @param id the id to set */ public void setId(long id) { this.id = id; } /** * @return the firstName */ public String getFirstName() { return firstName; } /** * @param firstName the firstName to set */ public void setFirstName(String firstName) { this.firstName = firstName; } /** * @return the lastName */ public String getLastName() { return lastName; } /** * @param lastName the lastName to set */ public void setLastName(String lastName) { this.lastName = lastName; } /** * @return the gender */ public String getGender() { return gender; } /** * @param gender the gender to set */ public void setGender(String gender) { this.gender = gender; } /** * @return the age */ public int getAge() { return age; } /** * @param age the age to set */ public void setAge(int age) { this.age = age; } @Override public String toString() { return "Student [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", gender=" + gender + ", age=" + age + "]"; } }
2. Write to CSV File:
CsvFileWriter
creates a comma separated value format “CSV” file from a set of students data and save it in your home directory. Firstly, it writes the CSV file header, and then it writes the students data using FileWriter
class.
CsvFileWriter.java:
package com.jcg; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author ashraf * */ public class CsvFileWriter { //Delimiter used in CSV file private static final String COMMA_DELIMITER = ","; private static final String NEW_LINE_SEPARATOR = "\n"; //CSV file header private static final String FILE_HEADER = "id,firstName,lastName,gender,age"; public static void writeCsvFile(String fileName) { //Create new students objects Student student1 = new Student(1, "Ahmed", "Mohamed", "M", 25); Student student2 = new Student(2, "Sara", "Said", "F", 23); Student student3 = new Student(3, "Ali", "Hassan", "M", 24); Student student4 = new Student(4, "Sama", "Karim", "F", 20); Student student5 = new Student(5, "Khaled", "Mohamed", "M", 22); Student student6 = new Student(6, "Ghada", "Sarhan", "F", 21); //Create a new list of student objects List students = new ArrayList(); students.add(student1); students.add(student2); students.add(student3); students.add(student4); students.add(student5); students.add(student6); FileWriter fileWriter = null; try { fileWriter = new FileWriter(fileName); //Write the CSV file header fileWriter.append(FILE_HEADER.toString()); //Add a new line separator after the header fileWriter.append(NEW_LINE_SEPARATOR); //Write a new student object list to the CSV file for (Student student : students) { fileWriter.append(String.valueOf(student.getId())); fileWriter.append(COMMA_DELIMITER); fileWriter.append(student.getFirstName()); fileWriter.append(COMMA_DELIMITER); fileWriter.append(student.getLastName()); fileWriter.append(COMMA_DELIMITER); fileWriter.append(student.getGender()); fileWriter.append(COMMA_DELIMITER); fileWriter.append(String.valueOf(student.getAge())); fileWriter.append(NEW_LINE_SEPARATOR); } System.out.println("CSV file was created successfully !!!"); } catch (Exception e) { System.out.println("Error in CsvFileWriter !!!"); e.printStackTrace(); } finally { try { fileWriter.flush(); fileWriter.close(); } catch (IOException e) { System.out.println("Error while flushing/closing fileWriter !!!"); e.printStackTrace(); } } } }
Let’s see how the generated student.csv
file is organized, it contains the header and the students data below.
student.csv:
id,firstName,lastName,gender,age 1,Ahmed,Mohamed,M,25 2,Sara,Said,F,23 3,Ali,Hassan,M,24 4,Sama,Karim,F,20 5,Khaled,Mohamed,M,22 6,Ghada,Sarhan,F,21
3. Read from CSV File:
CsvFileReader
reads the CSV file in java using BufferedReader
class then skipping the header and starting from the second line, we split each line using String.split()
function. A String.split()
function splits string around matches of the given regular expression. Finally, we create a new list of student and print it.
CsvFileReader.java:
package com.jcg; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * @author ashraf_sarhan * */ public class CsvFileReader { //Delimiter used in CSV file private static final String COMMA_DELIMITER = ","; //Student attributes index private static final int STUDENT_ID_IDX = 0; private static final int STUDENT_FNAME_IDX = 1; private static final int STUDENT_LNAME_IDX = 2; private static final int STUDENT_GENDER = 3; private static final int STUDENT_AGE = 4; public static void readCsvFile(String fileName) { BufferedReader fileReader = null; try { //Create a new list of student to be filled by CSV file data List students = new ArrayList(); String line = ""; //Create the file reader fileReader = new BufferedReader(new FileReader(fileName)); //Read the CSV file header to skip it fileReader.readLine(); //Read the file line by line starting from the second line while ((line = fileReader.readLine()) != null) { //Get all tokens available in line String[] tokens = line.split(COMMA_DELIMITER); if (tokens.length > 0) { //Create a new student object and fill his data Student student = new Student(Long.parseLong(tokens[STUDENT_ID_IDX]), tokens[STUDENT_FNAME_IDX], tokens[STUDENT_LNAME_IDX], tokens[STUDENT_GENDER], Integer.parseInt(tokens[STUDENT_AGE])); students.add(student); } } //Print the new student list for (Student student : students) { System.out.println(student.toString()); } } catch (Exception e) { System.out.println("Error in CsvFileReader !!!"); e.printStackTrace(); } finally { try { fileReader.close(); } catch (IOException e) { System.out.println("Error while closing fileReader !!!"); e.printStackTrace(); } } } }
4. Run the Example:
CsvWriteReadTest
is the main class to run CsvFileWriter
and CsvFileReader
for the given CSV file.
CsvWriteReadTest.java:
package com.jcg; /** * @author ashraf * */ public class CsvWriteReadTest { /** * @param args */ public static void main(String[] args) { String fileName = System.getProperty("user.home")+"/student.csv"; System.out.println("Write CSV file:"); CsvFileWriter.writeCsvFile(fileName); System.out.println("\nRead CSV file:"); CsvFileReader.readCsvFile(fileName); } }
Output:
Write CSV file: CSV file was created successfully !!! Read CSV file: Student [id=1, firstName=Ahmed, lastName=Mohamed, gender=M, age=25] Student [id=2, firstName=Sara, lastName=Said, gender=F, age=23] Student [id=3, firstName=Ali, lastName=Hassan, gender=M, age=24] Student [id=4, firstName=Sama, lastName=Karim, gender=F, age=20] Student [id=5, firstName=Khaled, lastName=Mohamed, gender=M, age=22] Student [id=6, firstName=Ghada, lastName=Sarhan, gender=F, age=21]
5. Download the Source Code of this example:
This was an example of how to to Write/Read CSV files.
You can download the full source code of this example here: Write/Read CSV Files Example Code
Now try it with data containing newlines and embedded commas.
Thanks for your blog. It helped me a lot. Can you help me to solve the problem of parsing a CSV cell which contains multiple comma(,)?
where file will get store after writing successfully .
thanks
where file will get store after writing successfully .
I’m facing Type mismatch error
for
(Student student : students)
i’m facing the same issue
same here
List<Student> students =
new
ArrayList();
This will work