Установите значение индикатора выполнения в соответствии с неизвестной длиной текстового файла - PullRequest
3 голосов
/ 27 сентября 2011

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

У меня уже есть свинг-работник, который выполняет мои функции, поэтому мой индикатор выполнения работает, но сейчас у меня просто есть значения от setIndeterminate до true, так что пользователь знает, что что-то делается, но не фактический прогресс.

Есть ли способ, с помощью которого я могу увеличивать индикатор выполнения после прочтения каждой строки, но не достигать 100 слишком рано или слишком поздно, желательно без полного прочтения текстового файла. Спасибо, Говядина.

Ответы [ 5 ]

5 голосов
/ 27 сентября 2011

Я бы использовал File.length () , чтобы определить размер файла.Затем следите за количеством прочитанных байтов, чтобы определить прогресс.

2 голосов
/ 27 сентября 2011

Если размер файла известен до того, как вы начнете его читать, вы можете читать его построчно и подсчитывать процент после каждой строки: подсчитать количество байтов в каждой строке и разделить его на общее количество байтов. (т.е. file.length()).

1 голос
/ 27 сентября 2011

Определить размер файла легко, используя java.io.File, поэтому проблема в том, чтобы получить размер в байтах, фактически считанный для простого индикатора выполнения, на ум приходят две возможности:

  1. Оценка: предположим, что 1 символ = 1 байт (или 1 символ = 2 байт, если ваш файл имеет формат UTF-16, ...). 1-байтовое предположение заставит вас недооценивать ваш фактический размер прочитанного, поэтому у вас будет скачок полосы в конце, в зависимости от того, сколько многобайтовых символов в вашем файле.

  2. Вычислить: перекодировать символы, считанные в байтовый массив, используя кодировку символов файлов и взять длину закодированного массива.

  3. Количество: как предложено Бренданом в комментариях ниже, используйте CountingInputStream (в правильном порядке после буферизации) для подсчета фактически прочитанных байтов.

Nr. 2. мне кажется ненужными накладные расходы в этом случае, поэтому я думаю, что буду придерживаться Nr. 1 или Nr. 3

1 голос
/ 27 сентября 2011

и перенесите вывод в GUI (в вашем случае Progress из JProgressBar) в invokeLater(), потому что вы довольно далеко от EDT, больше в Concurency в Swing

0 голосов
/ 27 сентября 2011

Вы можете иметь в своем приложении что-то вроде этого изображения:)

circle progress bar

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...