How read data from file that is separated by a blank line in Java

1.4k views Asked by At

For example I have a file "input.txt" :

This is the
first data

This is the second
data

This is the last data
on the last line

And I want to store this data in a ArrayList in this form:

[This is the first data, This is the second data, This is the last data on the last line]

Note: Every data in file is separated by a blank line. How to skip this blank line? I try this code but it don't work right:

    List<String> list = new ArrayList<>();

    File file = new File("input.txt");

    StringBuilder stringBuilder = new StringBuilder();

    try (Scanner in = new Scanner(file)) {
        while (in.hasNext()) {
            String line = in.nextLine();
            if (!line.trim().isEmpty())
                stringBuilder.append(line).append(" ");
            else {
                list.add(stringBuilder.toString());
                stringBuilder = new StringBuilder();
            }
        }
    } catch (FileNotFoundException e) {
        System.out.println("Not found file: " + file);
    }
3

There are 3 answers

0
Agus On

You are actually almost there. What you missed is that the last 2 lines need to be handled differently, as there is NO empty-string line at the bottom of the file.

        try (Scanner in = new Scanner(file)) {
            while (in.hasNext()) {
                String line = in.nextLine();
                //System.out.println(line);
                if (!line.trim().isEmpty())
                    stringBuilder.append(line).append(" ");
                else { //this is where new line happens -> store the combined string to arrayList
                    list.add(stringBuilder.toString());
                    stringBuilder = new StringBuilder();
                }
            }
            
            //Below is to handle the last line, as after the last line there is NO empty line
            if (stringBuilder.length() != 0) {
                list.add(stringBuilder.toString());
            } //end if
            
            for (int i=0; i< list.size(); i++) {
                System.out.println(list.get(i));
            } //end for
            
        } catch (FileNotFoundException e) {
            System.out.println("Not found file: " + file);
        }

Output of above:

This is the first data 
This is the second data 
This is the last data on the last line 
0
Saad Sahibjan On

I added an if codition right after the while loop in your code and it worked,

    List<String> list = new ArrayList<>();

    File file = new File("input.txt");

    StringBuilder stringBuilder = new StringBuilder();

    try (Scanner in = new Scanner(file)) {
        while (in.hasNext()) {
            String line = in.nextLine();
            if (!line.trim().isEmpty()) {
                stringBuilder.append(line).append(" ");
            }
            else {
                list.add(stringBuilder.toString());
                stringBuilder = new StringBuilder();
            }
        }
        if (stringBuilder.toString().length() != 0) {
            list.add(stringBuilder.toString());
        }
    } catch (FileNotFoundException e) {
        System.out.println("Not found file: " + file);
    }

    System.out.println(list.toString());

I got the below output

[This is the first data , This is the second data , This is the last data on the last line ]
0
Basil Bourque On

Blank lines are not really blank. There are end-of-line character(s) involved the terminate each line. An apparent empty line means you have a pair of end-of-line character(s) abutting.

Search for that pair, and break your inputs when found. For example, using something like String::split.

For example, suppose we have a file with the words this and that.

this

that

Let's visualize this file, showing the LINE FEED (LF) character (Unicode code point 10 decimal) used to terminate each line as <LF>.

this<LF>
<LF>
that<LF>

To the computer, there are no “lines”, so the text appears to Java like this:

this<LF><LF>that<LF>

You can more clearly now notice how pairs of LINE FEED (LF) characters delimit each line. Search for the instances of that pairing to parse your text.