Writer.write: примеры (JAVA)

Как работает write у Writer в Java
Раздел: Потоки ввода-вывода (Streams) символьные
Writer.write(char[] cbuf): void

Описание метода Writer.write

Метод Writer.write является частью абстрактного класса java.io.Writer и предназначен для записи символов в поток вывода. Используется при работе с текстовыми данными, когда необходимо вывести строку, массив символов или один символ в файл, консоль или другой выходной канал.

Метод имеет пять перегрузок:

  • write(int c) - записывает один символ, представленный целым числом от 0 до 65535 (Unicode code point). Старшие 16 бит игнорируются.
  • write(char[] cbuf) - записывает весь массив символов.
  • write(char[] cbuf, int off, int len) - записывает часть массива, начиная с индекса off длиной len символов.
  • write(String str) - записывает строку целиком.
  • write(String str, int off, int len) - записывает подстроку, начиная с индекса off длиной len символов.

Аргументы: для варианта с int - целое число; для массива - ссылка на массив char; для строки - объект String; для частичных вариантов - массив или строка, начальная позиция (int) и количество символов (int).

Возвращаемое значение: отсутствует (void).

Исключения: метод может выбросить IOException при ошибке ввода-вывода, IndexOutOfBoundsException при недопустимых значениях off или len, NullPointerException если передан null.

Примеры использования

Writer writer = new StringWriter();
writer.write(65); // запись символа 'A'
A
char[] chars = {'J','a','v','a','!'};
writer.write(chars); // запись массива
Java!
writer.write(chars, 1, 3); // запись 'ava'
ava
writer.write("Привет мир"); // запись строки
Привет мир
writer.write("Hello World", 6, 5); // запись 'World'
World

Альтернативные методы в Java

В Java существуют и другие способы записи символов:

  • OutputStream.write(byte[]) - запись байтов, используется для бинарных данных. Требуется преобразование символов в байты.
  • BufferedWriter.write - обёртка над Writer, добавляющая буферизацию. Предпочтительна для повышения производительности при большом количестве мелких записей.
  • PrintWriter.write - наследник Writer, поддерживает автоочистку и форматирование (printf, format). Удобен для вывода текста с применением форматирования.
  • Files.write (NIO) - статический метод класса Files, позволяющий записать строки или массив байтов в файл одной командой. Например:
    Files.write(Paths.get("file.txt"), "text".getBytes());
  • OutputStreamWriter - мост от байтового потока к символьному, часто используется в связке с FileOutputStream для указания кодировки.

Когда что использовать: для простой записи в файл с учётом кодировки - OutputStreamWriter; для частых мелких записей - BufferedWriter; для форматированного вывода - PrintWriter; для однократной записи небольшого объёма - Files.write.

Аналоги в других языках программирования

PHP: функция fwrite записывает строку в файловый дескриптор. Пример:

$fp = fopen('file.txt', 'w');
fwrite($fp, 'текст');
fclose($fp);
Файл file.txt содержит "текст"

JavaScript (Node.js): методы fs.writeFileSync или асинхронный fs.writeFile.

const fs = require('fs');
fs.writeFileSync('file.txt', 'текст', 'utf8');
Файл создан с содержимым "текст"

Python: метод write объекта файла.

with open('file.txt', 'w', encoding='utf-8') as f:
    f.write('текст')
Файл file.txt содержит "текст"

SQL: нет прямого аналога записи в поток. Для записи в поля таблицы используется INSERT с указанием строковых литералов.

INSERT INTO documents (content) VALUES ('текст');
Строка добавлена в таблицу

C#: класс StreamWriter с методом Write.

using (var sw = new StreamWriter('file.txt'))
    sw.Write('текст');
Файл создан с содержимым "текст"

Lua: метод write файлового объекта.

local f = io.open('file.txt', 'w')
f:write('текст')
f:close()
Файл содержит "текст"

Go: интерфейс io.Writer и функция io.WriteString.

f, _ := os.Create('file.txt')
io.WriteString(f, 'текст')
f.Close()
Файл содержит "текст"

Kotlin: расширение writeText для File.

File('file.txt').writeText('текст', Charsets.UTF_8)
Файл создан с содержимым "текст"

Отличия от Java: в большинстве языков запись символов выполняется подобным образом, но в Java требуется явно работать с потоками и ресурсами, часто нужен try-with-resources. В Python и Kotlin используется контекстный менеджер, что упрощает управление ресурсами. В Go используется явное закрытие, но интерфейс io.Writer универсален.

Типичные ошибки

  • IOException - возникает при проблемах с носителем (диск полон, файл недоступен). Пример:
    try {
        writer.write("data");
    } catch (IOException e) {
        // обработка
    }
  • NullPointerException - если writer равен null. Всегда следует проверять инициализацию.
  • IndexOutOfBoundsException - при неверных аргументах off или len. Пример:
    char[] data = "abc".toCharArray();
    writer.write(data, -1, 2); // выброс ArrayIndexOutOfBoundsException
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
  • IOException после закрытия - попытка записи после вызова close(). Нужно проверять состояние потока или использовать try-with-resources.
  • Проблемы с кодировкой - при создании Writer без указания кодировки используется платформенная, что может привести к потере символов. Рекомендуется явно указывать Charset.

Изменения в версиях Java

Сам метод Writer.write не претерпел изменений со времён Java 1.0. Однако появились новые возможности, упрощающие его использование:

  • Java 7 - введён try-with-resources, позволяющий автоматически закрывать Writer. Пример:
    try (Writer w = new FileWriter("file.txt")) { w.write("текст"); }
  • Java 11 - добавлен статический метод Writer.nullWriter(), который возвращает Writer, игнорирующий все записи. Полезно для тестирования или подавления вывода.
  • Java 8 - появление Files.newBufferedWriter и Files.write в пакете NIO, облегчающих запись в файлы.

Расширенные примеры использования

1. Запись большого объёма данных с буферизацией

Пример java
try (BufferedWriter bw = new BufferedWriter(new FileWriter("large.txt"))) {
    for (int i = 0; i < 100000; i++) {
        bw.write("Строка номер " + i + System.lineSeparator());
    }
}
Создан файл large.txt с 100000 строками
Пояснение: BufferedWriter уменьшает количество операций ввода-вывода за счёт буфера.

2. Запись с указанием кодировки через OutputStreamWriter

Пример java
try (Writer w = new OutputStreamWriter(new FileOutputStream("utf8.txt"), StandardCharsets.UTF_8)) {
    w.write("Привет, мир!");
}
Файл utf8.txt содержит текст в кодировке UTF-8
Пояснение: позволяет контролировать кодировку записи.

3. Создание кастомного Writer, пишущего в StringBuilder

Пример java
public class StringBuilderWriter extends Writer {
    private StringBuilder sb = new StringBuilder();
    public void write(char[] cbuf, int off, int len) {
        sb.append(cbuf, off, len);
    }
    public void flush() { }
    public void close() { }
    public String toString() { return sb.toString(); }
}

StringBuilderWriter custom = new StringBuilderWriter();
custom.write("Собственный writer");
System.out.println(custom.toString());
Собственный writer
Пояснение: можно реализовать свою логику записи, например в коллекцию или в лог.

4. Многопоточная запись через PipedWriter/PipedReader

Пример java
PipedWriter pw = new PipedWriter();
PipedReader pr = new PipedReader(pw);
new Thread(() -> {
    try (pw) { pw.write("из потока"); } catch (IOException e) { }
}).start();
char[] buf = new char[256];
int len = pr.read(buf);
System.out.println(new String(buf, 0, len));
из потока
Пояснение: PipedWriter и PipedReader обеспечивают передачу данных между потоками.

5. Использование PrintWriter для форматированного вывода

Пример java
try (PrintWriter pw = new PrintWriter(new FileWriter("formatted.txt"))) {
    pw.printf("Имя: %s, Возраст: %d%n", "Анна", 30);
}
В файле: Имя: Анна, Возраст: 30
Пояснение: PrintWriter добавляет удобные методы printf и format.

джава Writer.write function comments

En
Writer.write Writes an array of characters