Отслеживание чтения данных из потока Java

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

Использовать данный фильтр чрезвычайно просто. Следует лишь поместить ProgressMonitorInputStream в состав последовательности используемых потоков.

Предположим, например, что вам требуется читать текст из файла. Формирование последовательности начинается с потока FileInputStream:

Обычно этот поток преобразуют в InputStreamReader:

Если же вы хотите отслеживать чтение данных из потока, нужно сначала преобразовать FileInputStream в ProgressMonitorInputStream:

Конструктору ProgressMonitorInputStream передается родительский компонент, заголовок и, конечно же, поток, предназначенный для отслеживания. Метод read() данного класса анализирует количество прочитанных байтов и обновляет содержимое диалогового окна.

Создав объект ProgressMonitorInputStream, можно продолжить формирование последовательности потоков:

На этом действия по организации мониторинга чтения данных заканчивается. При чтении из файла автоматически отобразится окно, показанное на рис.2.

Отслеживание чтения данных из потока JavaРис.2. Окно, позволяющее отслеживать процесс чтения данных из потока ввода.

Для определения общего количества байтов в потоке объект ProgressMonitorInputStream использует метод available() класса InputStream. Однако этот метод возвращает лишь число байтов, которые могут быть прочитаны без блокировки ввода. Таким образом, рассматриваемый здесь фильтр хорошо работает с файлами и данными, получаемыми посредством протокола HTTP, поскольку их размер известен заранее, однако следует помнить, что результаты его применения к другим потокам могут быть гораздо хуже.

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

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

Обратите внимание, что в данном примере использован не самый эффективный способ заполнения текстовой области. Программа работала бы гораздо быстрее, если бы мы сначала прочитали файл в StringBuilder, а затем связали текстовую область с контекстом.

Однако в данном случае медленное выполнение программы является преимуществом, так как главная задача примера — продемонстрировать индикацию хода выполнения задачи.

Чтобы избежать мерцания, мы не отображаем текстовую область до ее заполнения.