Core Java

Java File To Two Dimensional Array

Handling data files is a common task in many Java applications, especially when working with structured data like tables or matrices. Let us delve into understanding how to work with a Java file containing a two-dimensional array.

1. Problem statement

Given a data file (e.g., a CSV file) containing rows and columns of information, we need to read this data into a 2D array in Java. Each row in the file should correspond to a row in the 2D array, and each value within a row should be stored in the array’s columns.

Let’s assume the data file, data.csv, contains the following sample data:

1,2,3
4,5,6
7,8,9

2. Using BufferedReader approach

BufferedReader is a basic and flexible way to read files line by line in Java. We can split each line by commas to populate a 2D array.

2.1 Code Example

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class BufferedReaderExample {
    public static void main(String[] args) {
        String filePath = "data.csv";
        int rows = 3;
        int cols = 3;
        int[][] data = new int[rows][cols];
        
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            int row = 0;
            while ((line = br.readLine()) != null && row < rows) {
                String[] values = line.split(",");
                for (int col = 0; col < values.length; col++) {
                    data[row][col] = Integer.parseInt(values[col]);
                }
                row++;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        // Display the 2D array
        for (int[] row : data) {
            for (int value : row) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
    }
}

2.1.1 Code Explanation and Output

In this code, we use BufferedReader to read each line from data.csv. For each line, split() is used to separate the comma-delimited values, which are parsed as integers and stored in the 2D array. Finally, we print out the array to verify the contents.

1 2 3 
4 5 6 
7 8 9

3. Using java.nio.file.Files approach

The Files API in java.nio is a modern and concise way to read all lines from a file in one step, allowing you to directly process each line into a 2D array.

3.1 Code Example

import java.nio.file.Files;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.List;

public class FilesExample {
    public static void main(String[] args) {
        String filePath = "data.csv";
        int[][] data;
        
        try {
            List<String> lines = Files.readAllLines(Paths.get(filePath));
            data = new int[lines.size()][];
            
            for (int i = 0; i < lines.size(); i++) {
                String[] values = lines.get(i).split(",");
                data[i] = new int[values.length];
                
                for (int j = 0; j < values.length; j++) {
                    data[i][j] = Integer.parseInt(values[j]);
                }
            }
            
            // Display the 2D array
            for (int[] row : data) {
                for (int value : row) {
                    System.out.print(value + " ");
                }
                System.out.println();
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.1.1 Code Explanation and Output

Here, Files.readAllLines() reads all lines into a List<String>. We then loop through each line, splitting it by commas and parsing it into an integer array. Each row is assigned to the 2D array. This method is concise and handles the file reading in one step.

1 2 3 
4 5 6 
7 8 9

4. Using Apache Commons CSV

For CSV files, the Apache Commons CSV library simplifies parsing and handling more complex cases (e.g., quoted fields).

First, add the dependency:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-csv</artifactId>
    <version>1.9.0</version>
</dependency>

4.1 Code Example

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.IOException;
import java.util.ArrayList;
import java.util.List;

public class ApacheCSVExample {
    public static void main(String[] args) {
        String filePath = "data.csv";
        List<int[]> dataList = new ArrayList<>();
        
        try (CSVParser parser = new CSVParser(new FileReader(filePath), CSVFormat.DEFAULT)) {
            for (CSVRecord record : parser) {
                int[] row = new int[record.size()];
                for (int i = 0; i < record.size(); i++) {
                    row[i] = Integer.parseInt(record.get(i));
                }
                dataList.add(row);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        int[][] data = dataList.toArray(new int[0][]);
        
        // Display the 2D array
        for (int[] row : data) {
            for (int value : row) {
                System.out.print(value + " ");
            }
            System.out.println();
        }
    }
}

4.1.1 Code Explanation and Output

Using CSVParser, we read each row into an integer array and add it to a List<int[]>. The list is then converted to a 2D array. This method is highly customizable and can handle advanced CSV formats (e.g., quoted fields).

1 2 3 
4 5 6 
7 8 9

5. Comparison

ApproachDescriptionComplexityFlexibility
BufferedReaderReads files line by line and splits each line by commas to populate a 2D array.SimpleBasic CSV parsing
java.nio.file.FilesUses the Files API to read all lines at once, allowing direct processing into a 2D array.ModerateConcise and efficient
Apache Commons CSVA library that simplifies parsing CSV files, handling complex cases like quoted fields.AdvancedHighly customizable

6. Conclusion

In Java, there are multiple ways to read a file into a 2D array, each with different levels of complexity and flexibility. BufferedReader is simple and effective for basic CSV files, while java.nio.file.Files provides a streamlined approach. For advanced CSV parsing, Apache Commons CSV offers a robust solution. Choose the method that best fits your needs based on the complexity of the file format and the specific requirements of your application.

Yatin Batra

An experience full-stack engineer well versed with Core Java, Spring/Springboot, MVC, Security, AOP, Frontend (Angular & React), and cloud technologies (such as AWS, GCP, Jenkins, Docker, K8).
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Back to top button