如何处理 EOFException?

How to handle EOFException?

此代码 returns 一个 EOFException,对添加什么或如何处理问题有什么建议吗?

public AbstractBlock readBlock(int blockNum, AbstractDBFile f)
        throws IOException {

    DBFile dbf = (DBFile) f;
    byte[] data2 = new byte[4096];
    RandomAccessFile file = new RandomAccessFile(dbf.fileName, "r");
    file.seek(4096+blockNum*4096);
    Block b = new Block();
    for (int i = 0; i < 4096; i++){
        data2[i] = file.readByte();
    }
    file.close();
    b.setData(data2);
    return b;

}

函数readByte可以抛出IOExceptionEOFException异常

public final byte readByte() throws IOException

Throws:

EOFException - if this file has reached the end.

IOException - if an I/O error occurs.

因此,如果您在分配给 data2[i] 变量

之前确实读过一些东西,那么您必须将它放在一个 try bloc 中,例如出海

您或许可以尝试这样做:

public AbstractBlock readBlock(int blockNum, AbstractDBFile f)
    throws IOException {

    DBFile dbf = (DBFile) f;
    byte[] data2 = new byte[4096];
    RandomAccessFile file = new RandomAccessFile(dbf.fileName, "r");
    file.seek(4096+blockNum*4096);
    Block b = new Block();

    for (int i = 0; i < 4096; i++){
        try{  
            data2[i] = file.readByte();
        }catch(EOFException ex){
            System.out.println("End of file reached!");

            //break the loop
            break;
         }
    }
    file.close();
    b.setData(data2);
    return b;
}

假设 blockNum==1 ... 这是否意味着您应该读取文件中的第一个块?如果是这样,您希望将 0 传递给 file.seek(),但实际上传递的是 4096+4096*1 = 8192。这意味着对于给定的块号,您实际上正在读取第二个块过去了。

如果是这样,那么对于一个 n 块文件,如果您将 nn-1 传递给此函数,您将得到一个 EOFException。

如果第一个块的编号是 0,而不是 1,那么您只差一个块,但基本问题仍然相同。

如果你的意思是'what should I do when I catch it?',你应该停止阅读并休息。如果你的意思是 'why am I getting it?',你的块编号应该从零开始,假设你对块的数量是正确的。