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