Writer.write: примеры (JAVA)
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); // выброс ArrayIndexOutOfBoundsExceptionException 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. Запись большого объёма данных с буферизацией
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
try (Writer w = new OutputStreamWriter(new FileOutputStream("utf8.txt"), StandardCharsets.UTF_8)) {
w.write("Привет, мир!");
}
Файл utf8.txt содержит текст в кодировке UTF-8Пояснение: позволяет контролировать кодировку записи.
3. Создание кастомного Writer, пишущего в StringBuilder
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
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 для форматированного вывода
try (PrintWriter pw = new PrintWriter(new FileWriter("formatted.txt"))) {
pw.printf("Имя: %s, Возраст: %d%n", "Анна", 30);
}
В файле: Имя: Анна, Возраст: 30Пояснение: PrintWriter добавляет удобные методы printf и format.