
Класс StringBuilder в Java применяется для работы со строками, которые часто изменяются. В отличие от String, объекты этого типа можно модифицировать без создания новых экземпляров, что снижает нагрузку на память. После формирования результата возникает задача вывести содержимое на экран или записать его в поток.
Использование метода toString() для преобразования

toString()возвращает новый объектString, содержащий текущее содержимое буфера.- Результат не связан с исходным
StringBuilder: дальнейшие изменения буфера не затрагивают строку. - Метод не требует параметров и вызывается напрямую у экземпляра
StringBuilder.
Пример использования:
StringBuilder sb = new StringBuilder();
sb.append("Пример ").append(123);
String result = sb.toString();
System.out.println(result); // Выведет: Пример 123
- Формируйте содержимое в
StringBuilder. - Вызывайте
toString()для получения итоговой строки.
Метод toString() является стандартным способом преобразования StringBuilder в строку и используется во всех сценариях, где требуется именно String.
Пример:
StringBuilder sb = new StringBuilder("Привет, Java!");
System.out.printf("Текущий текст: %s%n", sb.toString());
Пример:
StringBuilder sb = new StringBuilder();
sb.append("Java");
sb.append(" ");
sb.append(21);
System.out.printf("Текст: %s, число: %d%n", sb.toString(), 100);
Допустимо применять ширину и выравнивание: System.out.printf("|%-15s|%n", sb.toString()); выведет строку с выравниванием по левому краю в поле шириной 15 символов. Это удобно при табличном представлении данных.
Для чисел в StringBuilder можно предварительно выделить их подстрокой и преобразовать в число, а затем форматировать: Integer.parseInt(sb.substring(...)) с передачей в %d или %.2f для чисел с плавающей точкой.
Запись содержимого StringBuilder в файл

Для сохранения данных из StringBuilder удобно использовать классы из пакета java.io или java.nio.file. Наиболее распространённые способы:
- FileWriter – запись символов в текстовый файл;
- BufferedWriter – ускоряет процесс за счёт буфера;
- Files.write – быстрый способ при работе с небольшими объёмами данных;
- PrintWriter – упрощённая запись строк.
Пример с использованием BufferedWriter:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class SaveToFile {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("Первая строка\n");
sb.append("Вторая строка\n");
try (BufferedWriter writer = new BufferedWriter(new FileWriter("output.txt"))) {
writer.write(sb.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
}
Рекомендации:
- Используйте конструкцию try-with-resources для автоматического закрытия потока.
- При больших объёмах данных отдавайте предпочтение BufferedWriter.
- Учитывайте кодировку: по умолчанию FileWriter использует системную, при необходимости используйте OutputStreamWriter с явным указанием Charset.
- Для краткой записи строк небольшого размера подойдёт Files.write(Path, byte[]).
Для записи содержимого StringBuilder в лог удобно использовать стандартный java.util.logging.Logger. Метод toString() преобразует буфер в строку, после чего сообщение фиксируется в журнале.
import java.util.logging.Logger;
public class LogExample {
private static final Logger logger = Logger.getLogger(LogExample.class.getName());
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("Обработка завершена: ");
sb.append(42);
logger.info(sb.toString());
}
}
Выбор уровня логирования зависит от ситуации: отладочные данные – fine или finer, ошибки – severe, предупреждения – warning.
| Метод Logger | Назначение |
|---|---|
info(String) |
Информационные сообщения о штатной работе программы |
warning(String) |
Ситуации, которые не являются ошибками, но требуют внимания |
severe(String) |
Критические ошибки, приводящие к сбоям |
fine(String) |
Подробная информация для отладки |
При большом объёме данных стоит использовать logger.log(Level, Supplier<String>), чтобы избежать лишнего преобразования StringBuilder в строку при отключённом уровне логирования.
Для получения массива символов из StringBuilder применяется комбинация toString() и toCharArray(). Результатом становится отдельный массив char[], с которым можно выполнять прямой доступ по индексам.
Пример:
StringBuilder sb = new StringBuilder("Текст для примера");
char[] chars = sb.toString().toCharArray();
for (char c : chars) {
System.out.print(c);
}
Для разделения символов пробелами можно использовать индексный цикл:
for (int i = 0; i < chars.length; i++) {
System.out.print(chars[i]);
if (i < chars.length - 1) System.out.print(' ');
}
Метод getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) позволяет скопировать только нужный диапазон символов без создания промежуточной строки:
char[] buffer = new char[5];
sb.getChars(0, 5, buffer, 0);
System.out.println(buffer);
Для преобразования содержимого StringBuilder в поток используется метод chars(), который возвращает IntStream, представляющий последовательность символов.
StringBuilder sb = new StringBuilder("Пример");
String result = sb.chars()
.mapToObj(c -> (char)c)
.map(String::valueOf)
.collect(Collectors.joining());
Метод Collectors.joining() объединяет все символы в одну строку без добавления разделителей. Для вставки разделителей, например запятых, можно использовать Collectors.joining(",").
String digits = sb.chars()
.filter(Character::isDigit)
.mapToObj(c -> (char)c)
.map(String::valueOf)
.collect(Collectors.joining());
Использование потокового API позволяет комбинировать преобразования, фильтрацию и форматирование без необходимости промежуточного создания массивов или дополнительных циклов, обеспечивая компактный и читаемый код.
