Назад
Вперед
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();
Назад Вперед |