Главная » Java » SequencelnputStream в Java

0

 

  Средства класса SequencelnputStream позволяют создать единый поток ввода, состоящий из нескольких последовательно обрабатываемых байтовых потоков ввода: вводится содержимое первого потока от начала и до конца, затем второго и т.д. В составе класса SequencelnputStream предусмотрены два конструктора: первый, отвечающий часто встречающейся ситуации, в качестве параметров принимает две ссылки на потоки ввода, а второй, более общий, позволяющий объекту SequencelnputStream работать с произвольным числом потоков ввода, получает в виде аргумента объект типа Enumeration (см. раздел 16.12.1). Enumeration — это интерфейс, предусматривающий возможности упорядоченного просмотра списка объектов. При использовании в контексте SequencelnputStream объект Enumeration должен содержать только ссылки на объекты типа inputStream; в противном случае при попытке обращения к объекту из списка Enumeration, не относящемуся к InputStream, будет выброшено исключение типа ClassCastException.

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

import java.io.*;

import java.util.*;

class Concat {

        public static void main(String[]   args)

              throws  lOException

        {

              InputStream in;

              if (args.length == 0)   {

                     in = system.in;

              } else {

                InputStream filein, bufln;

                List inputs = new ArrayList(args.length);

                for (int i = 0; i < args.length; i++) {

                      filein = new FilelnputStream(args[i]);

                      bufln = new BufferedlnputStream(fileln);

                       inputs.add(bufin);

         }

      Enumeration files =

              Collections.enumeration(inputs);

       in = new SequenceinputStream(files)

        }

    int ch;

    while  ((ch = in.read())   != -1)

         System.out.write(ch);

     }

   //   ……..

}

Если программа вызывается без параметров командной строки, для ввода данных используется стандартный поток System.in. Если же параметры заданы, создается объект inputs списка ArrayList (см. раздел 16.6.1) с размером, достаточным для хранения такого количества объектов BufreredlnputStream, какое соответствует числу параметров командной строки. Для каждого из указанных файлов строится объект потока FilelnputStream (см. раздел 15.6.1) и добавляется в список inputs. По завершении цикла просмотра параметров командной строки и построения объектов потоков для получения объекта Enumeration, представляющего список потоков, используется метод enumeration класса Collections. Созданный объект Enumeration передается в виде аргумента конструктору SequencelnputStream для создания объекта, который обеспечивает последовательное слияние всех файловых потоков ввода в единый поток inputStream. Затем программа, используя цикл while, осуществляет чтение всех байтов единого потока ввода и передает их в стандартный поток вывода System.out.

   Можно было бы предложить иную реализацию типа Enumeration, чтобы метод nextElement последнего строил поток FilelnputStream для файла, задаваемого очередным параметром командной строки, и закрывал при этом предыдущий поток, если таковой был открыт.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии