Клас Seq uenceInputStream

Клас SequenceInputStream створює єдиний вхідний потік, читаючи дані з одного або декількох вхідних потоків: спочатку перший потік читається до самого кінця, потім – наступний за ним, і так далі, до останнього потоку Цей клас містить два конструктора: один – для найпростішого випадку двох вхідних потоків, які передаються в якості параметрів конструктора другий конструктор призначений для довільного кількості вхідних потоків, в ньому використовується абстрактне уявлення Enumeration, описане в главі 12 Реалізація інтерфейсу Enumeration дозволяє отримати впорядкований список обєктів будь-якого типу Для потоку Sequence InputStream перерахування може містити тільки обєкти типу Input Stream Якщо в ньому виявиться небудь ще, то при спробі отримання обєкта зі списку збуджується виключення SequenceInputStream

Наприклад, додаток Factor викликає метод factor Numbers для кожного аргументу, що входить в командний рядок Всі числа обробляються окремо, так що подібне розєднання параметрів не має особливого значення Проте, якби ваш додаток підсумувало числа з вхідного потоку, то було б необхідно зібрати всі значення воєдино У наведеному нижче додатку SequenceInputStream використовується для створення єдиного потоку з обєктів StringBufferInputStream для кожного з параметрів:

import javaio*

import javautilVector

class Sum {

public static void main(String[] args) {

InputStream in / / Потік, з якого читаються числа

if (argslength == 0) {

in = Systemin

} else {

InputStream stringIn

Vector inputs = new Vector(argslength)

for (int i = 0 i &lt&lt argslength i++) { String arg = args[i] + &quot "

stringIn = new StringBufferInputStream(arg)

inputsaddElement(stringIn)

}

in = new SequenceInputStream(inputselements())

}

try {

double total = sumStream(in) Systemoutprintln(&quotThe sum is &quot + total)

} catch (IOException e) { Systemoutprintln(e) Systemexit(-1) //

}

}

// ..

}

Якщо параметри відсутні, то для введення даних використовується Systemin В іншому випадку створюється обєкт Vector, розмір якого дозволяє зберігати стільки обєктів StringBufferInputStream, скільки аргументів в командному рядку Потім ми створюємо потік для кожного з аргументів і додаємо в кінці рядків прогалини, щоб розділити їх Потім потоки заносяться в вектор streams Після завершення циклу ми викликаємо метод elements вектора, щоб отримати обєкт Enumeration з елементами Enumeration використовується в конструкторі SequenceInputStream, котрий звязує всі потоки параметрів в єдиний потік InputStream Потім все числа в цьому потоці підсумовуються методом sumStream і виводиться результат Реалізація sumStream приведена в прикладі з розділу Клас StreamTokenizer. / Звичайно, проблему можна було вирішити й інакше – отримати єдиний рядок, в яку входять всі параметри, і створити один потік StringBufferInputStream /

Крім того, можна було створити і нову реалізацію Enumeration, яка б зверталася за кожним аргументом до потоку StringInputStream Подробиці наведені в розділі Інтерфейс Enumeration.

1113 Клас LineNumberInputStream

Обєкти класу LineNumberInputStream дозволяють стежити за нумерацією рядків під час читання даних з вхідного потоку Метод getLine Number, повертає поточний номер рядка Нумерація рядків починається з одиниці

Поточний номер рядка може бути заданий методом setLineNumber Це може виявитися корисним, коли ви працюєте з кількома вхідними потоками як з одним цілим, проте нумерація рядків повинна здійснюватися щодо початку кожного з потоків Наприклад, якщо SequenceInput Stream використовується для читання з декількох файлів як з одного потоку, то може виникнути потреба в окремій нумерації рядків для кожного з файлів, з якого надійшли дані

Вправа 115

Напишіть програму, яка читає заданий файл і шукає в ньому деяке слово

Програма повинна виводити кожну рядок, в якому зустрілося це слово, і її номер

1114 Клас PushbackInputStream

Клас PushbackInputStream забезпечує можливість відкоту на один символ потоку тому Це особливо корисно при поділі вхідного потоку на окремі лексеми Наприклад, щоб визначити, де закінчується лексема, часто доводиться читати символ, наступний за її кінцем Після перегляду символу, завершального поточну лексему, необхідно повернути його у вхідний потік, щоб він послужив початком наступної лексеми У наведеному нижче прикладі клас PushbackInputStream використовується для пошуку найдовшої послідовності повторень будь-якого байта в потоці:

import javaio*

class SequenceCount {

public static void main(String[] args) {

try {

PushbackInputStream

in = new PushbackInputStream(Systemin)

int max = 0 / / Довжина знайденої послідовності

int maxB = -1 / / Байт, з якого вона складається int b / / Поточний байт вхідного потоку do {

int cnt

int b1 = inread () / / Перший байт

/ / В послідовності

for (cnt = 1 (b = inread()) == b1 cnt++)

continue

if (cnt &gt&gt max) {

max = cnt / / Запамятати довжину

maxB = b1 / / Запамятати байт

}

inunread (b) / / Відкат до початку

/ / Наступній послідовності

} While (b = -1) / / Продовжувати до кінця потоку

Systemoutprintln(max + &quot bytes of &quot + maxB)

} catch (IOException e) { Systemoutprintln(e) Systemexit(1)

}

}

}

При досягненні кінця однієї послідовності відбувається читання байта, з якого починається наступна послідовність Метод unread дозволяє повернутися на одну позицію назад, щоб знову прочитати байт при виконанні циклу do для наступній послідовності

Буфер відкату являє собою захищене поле типу int з імям pushBack Підкласи можуть модифікувати це поле Значення -1 показує, що буфер відкоту порожній Будь-яке інше значення повертається в якості першого байта вхідного потоку методом Pushbackread

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*