Кажется грязным использовать исключение, чтобы указать, что конец файла достигнут. У каждого файла, который мы читаем, есть конец, поэтому он не кажется исключительным или неожиданным. Кроме того, мне не нравится использовать исключение для неисключительного потока моей программы.
Я говорю об использовании java.io.EOFException для сигнализации об окончании потока ввода данных:
Представьте себе файл, состоящий из следующих сообщений ...
----------------- ------------------
- 2-byte LENGTH - - N-byte PAYLOAD - , where N = LENGTH;
----------------- ------------------
... и чтение этого файла с помощью DataInputStream:
DataInputStream in = new DataInputStream(...);
...
try {
while (true) {
short length = in.readShort();
byte[] b = new byte[length];
in.readFully(b);
}
} catch (EOFException e) { }
...
В этом примере EOFException вызывается вызовом in.readShort()
. Должен ли я вычислить количество байтов в файле и прочитать именно это количество байтов (определяемое total -= length
, стремящимся к нулю) и выйти из цикла while без исключения? Я как бы ищу лучшую практику.
Должен ли я сделать что-то подобное?
long total = file.length();
while (total > 0) {
short length = in.readShort();
total -= length;
byte[] b = new byte[length];
in.readFully(b);
}
Спецификация API указывает, что EOFException указывает на то, что конец файла или конец потока достигнут неожиданно во время ввода. Но он также используется потоками ввода данных для оповещения об окончании потока.
Что мне делать, когда ожидается освобождение?