简体   繁体   中英

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

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);
    }

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.

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 

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 ]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM