Проверка нулевой позиции с помощью RandomAccessFile

Мне нужно проверить, не была ли записана позиция в файле произвольного доступа. Проблема в том, что когда позиция фактически не была записана, я получаю (как и ожидалось) исключение EOFException. Я читал документацию RandomAccessFile, чтобы попытаться решить эту проблему, и пытался исследовать в Интернете.

Что я пробовал:

  • Использование блока try-catch и перехват каждый раз, когда возникает исключение EOFException (использование try-catch в качестве условного оператора). Это работает, но это ужасная практика, и она очень неэффективна, так как в моем случае большую часть времени это EOF.

  • Использование BufferReader для перебора и проверки позиции. В итоге я столкнулся со многими проблемами и решил, что должен быть лучший способ.

Я не хочу копировать один файл в другой или выполнять какие-либо другие действия. Я знаю, что должен быть прямой способ сделать это, я просто не могу найти правильное решение.


person Dillon Burton    schedule 19.09.2013    source источник
comment
Позиция должна быть числом, которое не может быть null. Можете ли вы показать нам какой-нибудь код, который дает вам ноль?   -  person Peter Lawrey    schedule 19.09.2013
comment
Когда я ищу позицию, которая ничего не содержит, и пытаюсь прочитать позицию, я получаю исключение EOFException. Извините, я, вероятно, должен переформулировать свой вопрос.   -  person Dillon Burton    schedule 19.09.2013
comment
Поэтому я бы использовал FileChannel.length(), чтобы проверить, существуют ли нужные вам данные, прежде чем вы их ищете. Вам не нужно продолжать проверять его, если вы предполагаете, что он не станет меньше.   -  person Peter Lawrey    schedule 19.09.2013


Ответы (1)


Вы пытаетесь написать "хвост"?

Что вам нужно сделать, так это иметь один поток, который читает только те данные, которые есть, используя FileChannel.size() для проверки дополнительных данных. Эти данные передаются на вход по конвейеру. Это позволяет вам иметь второй поток, который непрерывно читает переданный поток, например. используя BufferedReader и блоки, где требуется больше данных.

person Peter Lawrey    schedule 19.09.2013
comment
Вы уверены, что это не FileChannel.size()? - person Dillon Burton; 19.09.2013
comment
@DillonBurton Правильно, это File.length(), с которым я запутался. Я предлагаю избегать File.length, так как он создает довольно много мусора. - person Peter Lawrey; 19.09.2013