【问题标题】:How to handle EOFException?如何处理 EOFException?
【发布时间】:2016-03-19 01:52:46
【问题描述】:

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

}

【问题讨论】:

  • 即使它超出了这个问题的范围,逐字节迭代文件效率非常低。你应该使用byte[] buffer = new byte[4096]; int count = file.read(buffer, 0, buffer.length);
  • 你能分享你的异常堆栈跟踪来定位你得到异常的位置吗?是否在 file.seek 中?
  • 不清楚您的问题是如何处理异常,或者为什么会发生异常。

标签: java bytearray randomaccessfile


【解决方案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;
}

【讨论】:

    【解决方案2】:

    函数readByte可以抛出IOExceptionEOFException异常

    公共最终字节 readByte() 抛出 IOException

    投掷:

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

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

    因此,如果您在分配给 data2[i] 变量之前确实阅读了某些内容,则必须将其放入 try bloc 中,例如 to sea

    【讨论】:

      【解决方案3】:

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

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

      如果第一个块的编号是 0,而不是 1,那么你只差一个块,但基本问题还是一样。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-08-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-04
          • 1970-01-01
          • 1970-01-01
          • 2013-03-02
          • 2013-10-16
          相关资源
          最近更新 更多