Java for Beginner
677 subscribers
546 photos
155 videos
12 files
836 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Класс StringReader в Java

В Java работа с потоками данных, таких как чтение и запись символов, реализована с помощью специальных классов, входящих в библиотеку ввода-вывода (java.io). Для чтения строковых данных в виде потоков символов предназначен класс StringReader. Этот класс является частью стандартной библиотеки Java и обеспечивает удобный интерфейс для чтения строк как потока символов.

Основная концепция StringReader

Класс StringReader используется для чтения содержимого строк как символов из потока. Он предоставляет функциональность, аналогичную чтению данных из файла или сетевого соединения, но только для строковых данных, хранящихся в оперативной памяти. По сути, он "эмулирует" файл, представляя строку в виде последовательности символов, которые можно читать по одному или группами.

StringReader является подклассом абстрактного класса Reader и реализует его методы, такие как read(), skip(), ready(), а также обеспечивает поддержку методов закрытия потока close().

Внутреннее устройство класса StringReader

Под капотом StringReader использует массив символов (char[]), созданный из переданной строки, а также управляет положением текущего символа в этом массиве.

Инициализация: При создании объекта StringReader строка передается в конструктор и сохраняется в виде массива символов. Например:
StringReader reader = new StringReader("Hello, World!");


Позиционирование указателя: Класс управляет указателем на текущую позицию в массиве символов, который увеличивается после каждого прочитанного символа. Это похоже на то, как читаются символы из файла или другого потока данных.
Методы чтения и пропуска: Методы read(), read(char[], int, int) и skip() управляют чтением и перемещением указателя. Например, метод read() возвращает текущий символ и сдвигает указатель на следующий.
Контроль конца строки: Когда указатель достигает конца строки, методы возвращают -1, указывая, что данные закончились. Это поведение аналогично поведению других потоков, таких как FileReader или InputStreamReader.

Поля и переменные

Внутренние поля класса StringReader:
String str — исходная строка, переданная в конструктор.
int length — длина строки.
int next — текущая позиция в строке.
int mark — позиция для функции отметки (mark), используется для возврата к определенному месту в потоке.


Основные особенности класса StringReader

Легковесность и простота: StringReader предназначен только для чтения строк, что делает его простым в использовании и легко интегрируемым с другими потоками.
Поток символов: В отличие от байтовых потоков,
StringReader работает с символами (char), что позволяет удобно обрабатывать текстовую информацию, не занимаясь преобразованием кодировок.
Поддержка методов чтения и буферизации: Класс поддерживает методы чтения, такие как read() (читает один символ) и read(char[], int, int) (читает блок символов в массив). Это упрощает работу с данными в строках.
Сброс и отметка (mark): Класс поддерживает метод mark(int readAheadLimit), который позволяет установить позицию "отметки" в строке, чтобы потом вернуться к ней с помощью метода reset(). Это удобно при парсинге сложных строк.


#Java #Training #Medium #StringReader
Примеры использования StringReader

Чтение строки посимвольно:
import java.io.StringReader;
import java.io.IOException;

public class StringReaderExample {
public static void main(String[] args) {
String text = "Hello, Java!";
StringReader reader = new StringReader(text);

try {
int character;
// Чтение символов один за другим
while ((character = reader.read()) != -1) {
System.out.print((char) character); // Печатает каждый символ строки
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Результат:
Hello, Java!
В этом примере мы используем StringReader для чтения строки посимвольно. Метод read() возвращает код символа, который мы приводим к char для отображения.


Чтение блока символов:

import java.io.StringReader;
import java.io.IOException;

public class StringReaderBufferExample {
public static void main(String[] args) {
String text = "This is an example of using StringReader.";
StringReader reader = new StringReader(text);
char[] buffer = new char[10]; // Создаем буфер для чтения 10 символов

try {
int charsRead;
while ((charsRead = reader.read(buffer, 0, buffer.length)) != -1) {
System.out.print(new String(buffer, 0, charsRead));
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


Результат:
This is an example of using StringReader.
Здесь мы используем буфер для чтения группы символов за один раз, что упрощает обработку больших строк.


Использование метода mark и reset:
import java.io.StringReader;
import java.io.IOException;

public class StringReaderMarkResetExample {
public static void main(String[] args) {
String text = "Mark and reset example";
StringReader reader = new StringReader(text);

try {
System.out.print((char) reader.read()); // Читаем первый символ 'M'
reader.mark(10); // Ставим метку после первого символа
System.out.print((char) reader.read()); // Читаем следующий символ 'a'
System.out.print((char) reader.read()); // Читаем символ 'r'
reader.reset(); // Возвращаемся к метке
System.out.print((char) reader.read()); // Читаем снова символ 'a'
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

Результат:
Метод mark() позволяет установить точку возврата в потоке, а reset() перемещает указатель обратно к этой точке. В примере видно, что после вызова reset() символ 'a' читается повторно.


Применение
StringReader в реальных проектах

Парсинг строковых данных:
StringReader полезен при разборе и анализе строковых данных, особенно если данные поступают в виде строк.
Тестирование методов ввода-вывода: Класс часто используется в юнит-тестах для эмуляции файловых или сетевых потоков. Например, при тестировании методов, принимающих Reader как параметр,
StringReader позволяет подставить строку и протестировать метод без создания файлов.
Обработка текстовых данных: Преобразование строковых данных, удаление символов или замена частей строк с использованием
StringReader делают код более удобным и читаемым.

#Java #Training #Medium #StringReader