Мне нужна небольшая помощь с компонентом JProgressBar
. Моя программа копирует файлы из одного места в другое, используя java.nio FileChannels
. Фактический метод копирования - transferFrom()
.Как отслеживать прогресс (JProgressBar) с помощью метода передачи FileChannelsFrom()?
У меня сейчас два вопроса.
Как контролировать ход передачи файлов FileChannels? Все обучающие программы, которые я нашел, используют обычные java.io InputStreams и увеличивают прогресс int во время цикла через входной поток.
Мои методы копирования (методы FileChannel) инкапсулируются в отдельный метод, который вызывается другими методами, которые выполняют итерацию по папкам источника и назначения, а затем вызывают методы FileChannel для каждого файла.
Как реализовать ProgressBar для полного механизма копирования?
Ну, я должен был прочитать FAQ немного раньше, поэтому, я думаю, мне нужно отредактировать свой начальный пост, а не комментировать ответы, верно?
Хорошо, это то, что я сделал до сих пор. Так же, как предложил jambjo (спасибо, кстати), метод transferFrom()
теперь зациклирован. BTW: Есть ли предпочтительный размер фрагмента или зависит от детализации моего индикатора выполнения так же, как EJP?
Вот мой фрагмент кода:
while (position < size) {
position += destination.transferFrom(source, position, chunkSize);
current = (position/size)*100;
System.out.println(current);
}
К сожалению, «текущий» значение остается 0 в цикле, и я не имею ни малейшего представления, почему. Я что-то упустил?
Еще раз спасибо jambjo! Я очень ценю ваш вклад! Теперь, когда мониторинг прогресса одного файла работает, давайте обратимся ко второй проблеме.
Я бы хотел, не должен, следить за ходом не только одного файла, но и множества файлов. Мои основные методы копирования повторяются через различные каталоги и копируют соответствующие файлы, вызывая фактический метод передачи. Таким образом, методы копирования не передают файлы, они просто выбирают файлы для фактического способа передачи.
Если позиция и размер являются целыми типами (int или long), то целочисленная позиция/размер деления всегда будет 0, если размер больше, чем позиция. (int) (100. * позиция/размер), вероятно, сделает то, что вы хотите. – jarnbjo