如何处理EOFException?

时间:2016-03-19 01:52:46

标签: java bytearray randomaccessfile

此代码返回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;

}

4 个答案:

答案 0 :(得分:1)

您可以尝试这样做:

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

答案 1 :(得分:0)

函数readByte可以抛出IOExceptionEOFException例外

  

public final byte readByte()抛出IOException

     

抛出:

     

EOFException - 如果此文件已到达结尾。

     

IOException - 如果发生I / O错误。

所以如果在分配到 data2 [i] 变量

之前你真的读过一些东西,你必须把它放在试试集团中。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

如果你的意思是“当我抓住它时我该怎么办?”,你应该停止阅读和休息。如果你的意思是'为什么我得到它?',你的块编号应该从零开始,假设你对块的数量是正确的。