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
мин.
Интерфейс Runnable в Java
10
мин.
Volatile переменная в Java
9
мин.