Топ-100FilterStream в Java - CodOrbits
LogoCodOrbits

Раздел: Потоки ввода/вывода

Раздел о том, как работать с файлами и потоками в Java: чтение, запись, буферизация и сериализация данных.

Все разделы
Иконка Потоки ввода/вывода

FilterStream в Java

Last updated: 6 мая 2025 г.

FilterInputStream, FilterOutputStreamабстрактные классы для создания собственных потоков или добавления функционала к существующим.

В примере ниже создается класс расширяющий FilterInputStream, в котором мы реализуем свой поток байтового ввода. Этот созданный нами поток изменяет консольный байтовый ввод System.in так, чтобы он возвращал номер в таблице ASCII введенного пользователем в консоль символа, но сдвинутого на 13 символов в этой таблице.

Пример программы:

1import java.io.*;
2import java.util.*;
3
4class Rot13InputStream extends FilterInputStream {
5    // Переданный в конструктор поток i
6    public Rot13InputStream(InputStream i) {
7        // Передаем в конструктор класса родителя через super.
8        super(i);
9        // Там этот поток сохраняется.
10        // И будет доступен здесь в наследнике через in,
11        // которым мы пользуемся ниже.
12    }
13
14    // Переопределим read, чтобы он возвращал сдвинутое значение
15    public int read() throws IOException {
16        // С помощью read считываем символ потоком in,
17        // переданный сюда через конструктор,
18        // и передаем его в созданный нами метод rot13.
19        return rot13(in.read());
20    }
21
22    // Сдвиг на 13 символов
23    public int rot13(int c) {
24        // Сильно не разбирайтесь в коде ниже. Просто знайте,
25        // что он сдвигает номер символа в ASCII на 13 символов.
26        if ((c >=A) && (c <= 'Z'))
27            c = (((c - 'A') + 13) % 26) + 'A';
28        if ((c >= ‘a’) && (c <= 'z'))
29            c = (((c - 'a') + 13) % 26) + 'a';
30        return c; // Этот сдвинутый номер возвращается
31    }
32}
33
34class FilterStreamLesson {
35    public static void main(String[] args) {
36        try {
37            Rot13InputStream b13is = new Rot13InputStream(System.in);
38            // Воспользуемся переопределенным нами read()
39            // в Rot13InputStream, который будет сдвигать номер
40            // введенного в поток символа на 13 значений
41            // в таблице ASCII и возвращать сдвинутый номер.
42            System.out.println(b13is.read());
43        } catch (Exception e) {
44            // Обработаем возможную ошибку
45            e.printStackTrace();
46        }
47    }
48}

Вывод:

Номер символа а в таблице ASCII – 97, но поскольку мы сдвинули его на 13 символов выводиться 110.


Следующие уроки

Многопоточность в Java. создание и запуск потоков с помощью Thread

11
мин.

Similar Articles Icon
Divider

Интерфейс Runnable в Java

10
мин.

Similar Articles Icon
Divider

Volatile переменная в Java

9
мин.

Similar Articles Icon