FilterStream в Java

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

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

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

import java.io.*; import java.util.*; class Rot13InputStream extends FilterInputStream { // Переданный в конструктор поток i public Rot13InputStream(InputStream i) { // Передаем в конструктор класса родителя через super. super(i); // Там этот поток сохраняется. // И будет доступен здесь в наследнике через in, // которым мы пользуемся ниже. } // Переопределим read, чтобы он возвращал сдвинутое значение public int read() throws IOException { // С помощью read считываем символ потоком in, // переданный сюда через конструктор, // и передаем его в созданный нами метод rot13. return rot13(in.read()); } // Сдвиг на 13 символов public int rot13(int c) { // Сильно не разбирайтесь в коде ниже. Просто знайте, // что он сдвигает номер символа в ASCII на 13 символов. if ((c >= ‘A’) && (c <= 'Z')) c = (((c - 'A') + 13) % 26) + 'A'; if ((c >= ‘a’) && (c <= 'z')) c = (((c - 'a') + 13) % 26) + 'a'; return c; // Этот сдвинутый номер возвращается } } class FilterStreamLesson { public static void main(String[] args) { try { Rot13InputStream b13is = new Rot13InputStream(System.in); // Воспользуемся переопределенным нами read() // в Rot13InputStream, который будет сдвигать номер // введенного в поток символа на 13 значений // в таблице ASCII и возвращать сдвинутый номер. System.out.println(b13is.read()); } catch (Exception e) { // Обработаем возможную ошибку e.printStackTrace(); } } }

Вывод:

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

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

Изучите создание потоков в Java через Thread, Runnable и Callable. Узнайте, как работает параллельное выполнение кода и переопределение методов потоков.
Time to read: 11

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

Преимущества Runnable над Thread: экономия памяти, гибкость кода и поддержка многопоточности. Пример реализации и сравнение подходов.
Time to read: 10

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

Разберитесь с ключевым словом volatile в Java: как оно обеспечивает видимость изменений переменной для всех потоков. Практический пример использования.
Time to read: 9