Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Выбор файлов
Простейший редактор текста
Копирование файлов UNICODE
Сохранение объекта Java в файле
Произвольные классы и файлы
Буферизация потоков
Разбор конфигура-
ционного файла

Работа с консолью
Работа с классом PrintWriter
Разбор строк класса String
Загрузка и просмотр изображений
Потоки в оперативной памяти
Конвейерные потоки
Комбинирование двух потоков
Комбинирование нескольких потоков
Поиск слова в текстовом файле
Произвольный доступ к файлу
Информация о файле
Работа с каталогами
Просмотр содержимого каталога
Просмотр каталога с фильтром
Панель для выбора каталога
Список системных свойств
Сохранение списка системных свойств
Контрольная сумма файла
Копирование, переименование, удаление файлов
Архивы ZIP
Создание архива ZIP
Распаковка архива ZIP
Обход дерева каталогов

Назад Вперед

7.14. Комбинирование двух потоков

На примере автономного приложения мы показали способ слияния содержимого двух файлов путем комбинирования двух входных потоков, связанных с файлами, в один выходной поток. При этом мы использовали поток класса SequenceInputStream.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Немного теории

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

В классе SequenceInputStream предусмотрено два конструктора.

Первому конструктору передаются два потока класса InputStream (или классов, созданных на базе InputStream). В результате с помощью этого конструктора вы можете скомбинировать только два потока.

Второму конструктору передается ссылка на объект, реализующий интерфейс Enumeration. Благодаря этому такой конструктор пригоден для объединения нескольких потоков.

Описание примера

В этом примере мы покажем использование потока класса SequenceInputStream для слияния двух файлов. Пути к сливаемым файлам передаются автономному приложению через параметры.

Когда метод main нашего приложения получает управление, он проверяет количество переданных ему параметров. Если оно не равно двум, на консоль выводится сообщение об ошибке.

В том случае, когда параметры указаны правильно, метод main выводит их на консоль для контроля:

if(args.length == 2)
{
  System.out.println("Merge: " + 
    args[0] + ", " + args[1]);
  . . .
}

Далее выполняется попытка создания входного комбинированного потока класса SequenceInputStream:

SequenceInputStream sis;
 try
{
  sis = new SequenceInputStream(
    new FileInputStream(args[0]),
    new FileInputStream(args[1]));
  . . .
}

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

Результат слияния будет записан в файл с именем !merged.txt. Для него создается поток класса FileOutputStream:

FileOutputStream fos;
fos = new FileOutputStream(
  "!merged.txt");  

Если все потоки удалось успешно создать, метод main организует цикл копирования данных из комбинированного потока класса SequenceInputStream в выходной поток:

int b;
while(true)
{
  b = sis.read();
  if(b == -1)
    break;
  fos.write(b);
}  

Условием завершения цикла является достижение конца комбинированного потока. В этом случае метод read возвращает значение -1.

После завершения копирования оба потока закрываются:

sis.close();
fos.close();

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

catch (IOException ex)
{
  System.out.println(ex.toString());
  System.exit(0);
}

Назад Вперед

[Назад]