Java, need a while loop to reach eof. i.e.while !eof, keep parsing

前端 未结 3 563
花落未央
花落未央 2021-01-14 10:45

I currently have a working parser. It parses a file once(not what I want it to do) and then outputs parsed data into a file. I need it to keep parsing and appending to the s

相关标签:
3条回答
  • 2021-01-14 11:23

    Warning: This answer is incorrect. See the comments for explanation.


    Instead of looping until an EOFException is thrown, you could take a much cleaner approach, and use available().

    DataInputStream dis = new DataInputStream(new FileInputStream(inFile));
    while (dis.available() > 0) {
        // read and use data
    }
    

    Alternatively, if you choose to take the EOF approach, you would want to set a boolean upon the exception being caught, and use that boolean in your loop, but I do not recommend it:

    DataInputStream dis = new DataInputStream(new FileInputStream(inFile));
    boolean eof = false;
    while (!eof) {
        try {
            // read and use data
        } catch (EOFException e) {
            eof = true;
        }
    }
    
    0 讨论(0)
  • 2021-01-14 11:34

    DataInputStream has a lot of readXXX() methods that do throw EOFException but the method that you're using DataInputStream.read() does not throw EOFException.

    To correctly identify the EOF while using read() implement your while loop as follows

    int read = 0;
    byte[] b = new byte[1024];
    while ((read = dis.read(b)) != -1) { // returns numOfBytesRead or -1 at EOF
      // parse, or write to output stream as
      dos.write(b, 0, read); // (byte[], offset, numOfBytesToWrite)
    }
    
    0 讨论(0)
  • 2021-01-14 11:34

    If you are using FileInputStream, here's an EOF method for a class that has a FileInputStream member called fis.

    public boolean isEOF() 
    { 
        try { return fis.getChannel().position() >= fis.getChannel().size()-1; } 
        catch (IOException e) { return true; } 
    }
    
    0 讨论(0)
提交回复
热议问题