Я думаю, что вам лучше всего получить блок байтов в зависимости от длины файла, а затем освободить файл и проанализировать ByteArrayInputStream (вместо попытки чтения непосредственно из файла).
Так что используйте RandomAccessFile # read (byte []) и размер буфера, используя длину возвращаемого файла. Вы не всегда будете показывать точный конец файла, но этого следует ожидать при использовании такого алгоритма опроса.
Кроме того, этот алгоритм ужасен - вы выполняете операции ввода-вывода в сумасшедшем замкнутом цикле - вызовы File # length () будут блокироваться, но не очень сильно. Ожидайте, что эта рутина поставит ваше приложение на колени с точки зрения процессора. У меня не обязательно есть лучшее решение для вас (ну, собственно, да, исходное приложение записывает в поток вместо файла, но я понимаю, что это не всегда возможно).
В дополнение к вышесказанному, вы можете захотеть ввести задержку опроса (засыпать поток на 100 мс в каждом цикле - мне кажется, что вы отображаете графический интерфейс - задержка в 100 мс никому не повредит и сильно улучшить производительность операций свинга).
ок - финальная говядина: вы настраиваете компонент Swing из того, что (я надеюсь) является кодом, не работающим на EDT. Используйте SwingWorker # invokeLater () для обновления текстовой панели.