Как обрабатывать исключение 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;

}

person Omar Fayez    schedule 19.03.2016    source источник
comment
Несмотря на то, что это выходит за рамки этого вопроса, итерация по файлу байт за байтом очень неэффективна. Вы должны использовать byte[] buffer = new byte[4096]; int count = file.read(buffer, 0, buffer.length);.   -  person sturcotte06    schedule 19.03.2016
comment
Можете ли вы поделиться своей трассировкой стека исключений, чтобы определить, где вы получаете исключение? Это в файле .seek?   -  person The Roy    schedule 19.03.2016
comment
Неясно, вопрос в том, как обрабатывать исключение или почему исключение вообще происходит.   -  person Dave Costa    schedule 19.03.2016
comment
Возможный дубликат EOFException - как обрабатывать?   -  person Raedwald    schedule 25.03.2016


Ответы (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;
}
person rahsan    schedule 19.03.2016

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

общедоступный последний байт readByte() вызывает IOException

Броски:

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

IOException - если возникает ошибка ввода-вывода.

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

person HDJEMAI    schedule 19.03.2016

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

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

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

person Dave Costa    schedule 19.03.2016

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

person user207421    schedule 19.03.2016