Как справиться с EOFException?

Этот код возвращает исключение 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 ответа

Решение

Возможно, вы можете попробовать сделать это:

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

Если вы имеете в виду "что мне делать, когда я поймаю это?", Вам следует перестать читать и ломать голову. Если вы имеете в виду "почему я это получаю?", Нумерация блоков должна начинаться с нуля, если вы правильно указали количество блоков.

Функция readByte может бросить IOException а также EOFException исключения

открытый финальный байт readByte() выбрасывает IOException

Броски:

EOFException - если этот файл достиг конца.

IOException - если ошибка ввода-вывода происходит.

поэтому вы должны поместить его в блок try, например, в море, если вы действительно что-то прочитали, прежде чем присваивать переменной data2[i]

Скажи это blockNum==1... означает ли это, что вы должны читать самый первый блок в файле? Если это так, вы ожидаете пройти 0 в file.seek(), но вы фактически передаете 4096+4096*1 = 8192. Это означает, что для данного blockNum вы фактически читаете 2-й блок после него.

Если так, то для n-блочного файла, если вы передадите n или же n-1 к этой функции вы получите исключение EOFException.

Если первый блок пронумерован 0, а не 1, то у вас только один блок, но основная проблема остается той же.

Другие вопросы по тегам