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

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

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

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

Назад Вперед

7.15. Комбинирование нескольких потоков

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

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

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

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

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

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

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

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

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

Если вы указали путь хотя бы к одному файлу, метод main создает объект класса Vector, размер которого равен количеству сливаемых файлов:

Vector files;
files = new Vector(args.length);

Далее метод main заполняет массив files класса Vector, добавляя в него ссылки на создаваемых по ходу дела потоки класса FileInputStream:

System.out.println("Merge: ");
      
try
{
  for(int i = 0; i < args.length; i++)
  {
    files.addElement(
      new FileInputStream(args[i]));
    System.out.println(args[i]);
  }
}
catch (FileNotFoundException ex)
{
  System.out.println(ex.toString());
  System.exit(0);
}

Список путей к сливаемым файлам выводится на консоль.

После формирования массива ссылок на входные потоки сливаемых файлов мы создаем комбинированный поток класса SequenceInputStream и выходной поток класса FileOutputStream:

SequenceInputStream sis;
FileOutputStream fos;
try
{
  sis = new SequenceInputStream(
    files.elements());
          
  fos = new FileOutputStream(
    "!merged.txt");
  . . .
}

Обратите внимание, что мы передаем конструктору класса SequenceInputStream перечисление Enumeration всех элементов вектора files, полученное методом elements.

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

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

Назад Вперед

[Назад]