简体   繁体   中英

Line when reading a file is empty but the line is not null

I have a problem in java and i dont understand why, since i think i am doing text-book stuff.

An overview in what of want to do is :

  1. I want to create a file that contains in each line two strings: documentPath, documentID (in this format: "documentPath;documentID;")
  2. I want to be able to add lines at the end of the file and load the file to a Java Data Structure, lets say a HashSet.
  3. Each time i want to add a new line, i load all the file in a HashSet, check if the line i want to add is not already there and eventually add it at the end. (small number of data - don't care about efficiency)

The code

Add file:

public void addFile(String documentPath) {
    this.loadCollection(); //METHOD IS NOT CONTINUING: ERROR HERE
    if (!documentsInfo.contains(documentPath)) {
        try {
            PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(this.collectionFile, true)));
            DocumentInfo documentInfo = new DocumentInfo(documentPath, ++this.IDcounter);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Load file:

    public void loadCollection() {
    if (loaded) {return;} 

    BufferedReader br;
    try {
        br = new BufferedReader(new FileReader(collectionFile));

        String line;
        while ( (line = br.readLine())!= null ) { //PROBLEM HERE
            System.out.println("the line readed from file-" + line + "-");
            System.out.println("is the line null: "+ (line==null));
            System.out.println("line length: " + line.length());
            DocumentInfo documentInfo = new DocumentInfo(line);
            documentsInfo.add(documentInfo);
        }
        br.close();
        open = true;
    } catch (IOException e) {
        e.printStackTrace();
    }
}

create the line to add:

public DocumentInfo(String fileLine) {
    String delimiter = Repository.DOCUMENT_FILE_SEPARATOR;
    StringTokenizer tok = new StringTokenizer(fileLine, delimiter);

    System.out.println("Tokenizer starts with string: " + fileLine);

    this.documentPath = tok.nextToken(); //EXCEPTION here
    this.documentId = Integer.parseInt(tok.nextToken());
}

public String toString() {
    String sep = Repository.DOCUMENT_FILE_SEPARATOR;
    return this.getDocumentPath()+sep+this.getDocumentId()+sep+"\n";
}

I am getting the exception at the Tokenizer method (java.util.NoSuchElementException) when i try to get the nextToken, but the problem comes from the loadCollection() method. The first time i read the contents of the file nothing is there, the line is empty (lenght: 0) but the line is not null, so the while-condition fails to stop the while iteration.

Here is what i get from the debbuging prints:

the line readed from file--
is the line null: false
line length: 0
Tokenizer starts with string:

Can anyone help me with this?

You get a null only when you have exhausted the stream. But the first line of the stream (your file) is just an empty line - and you load it, the result of the empty line, is an empty string ( "" ). It can be easily solved by skipping lines with string.length() == 0 , by adding the following in your while loop:

if (line.length() == 0) continue;

You might want to consider using trim() before checking the length as well, to avoid nasty spaces making the string.length() > 0

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