FileWriter против BufferedWriter

Я хотел бы знать, буферизуется ли FileWriter.

В этот вопрос SO кажется, что это так, однако в этот ТАК вопрос кажется, что это не так (это будет системный вызов для каждого вызова write(..).

Так что в основном, читая эти два вопроса и ответа, я немного сбит с толку. Кто-нибудь может внятно объяснить?

Заранее спасибо.

EDIT: проблема решена путем чтения этот API, соответствующую часть которого я цитирую:

Каждый вызов метода write() приводит к вызову преобразователя кодировки для данного символа(ов). Полученные байты накапливаются в буфере перед записью в базовый выходной поток. Размер этого буфера можно указать, но по умолчанию он достаточно велик для большинства целей. Обратите внимание, что символы, передаваемые методам write(), не буферизуются.

Для максимальной эффективности рассмотрите возможность обернуть OutputStreamWriter внутри BufferedWriter, чтобы избежать частых вызовов преобразователя. Например:

Writer out = новый BufferedWriter (новый OutputStreamWriter (System.out));

Поскольку FileWriter расширяет OutputStreamWriter, он применим и к нему.

Спасибо за ваше время, хотя я знаю, что спросил что-то довольно конкретное.


person Rollerball    schedule 27.07.2013    source источник


Ответы (2)


Я бы рекомендовал всегда использовать BufferedWriter. Это позволяет вам контролировать фактический размер буфера, и вы можете гарантировать, что независимо от используемой вами JVM операции ввода-вывода будут буферизированы, что значительно повысит производительность операций ввода-вывода.

person morpheus05    schedule 27.07.2013
comment
Хорошо, но как насчет FileWriter, он буферизован? У него есть только этот знаменитый стандартный байт-буфер? Как это работает? это JVM, который обрабатывает это? - person Rollerball; 27.07.2013
comment
Взгляд в код JDK 1.7 показал, что writeBuffer находится в базовом классе Writer. Так что у всех писателей есть этот буфер. BufferedWriter использует второй буфер private char cb[]; Это приводит к выводу, что этот скрытый буфер может быть частью не всех реализаций JDK (как насчет Android?) - person morpheus05; 27.07.2013
comment
Нет. Метод записи переопределен в OutputStreamWriter. Буферизация происходит в StreamEncoder, используемом OutputStreamWriter, который кодирует символы в байты. - person JB Nizet; 27.07.2013
comment
Вы правы, OutputStreamWriter переопределяет большинство методов записи и обходит буфер в базовом классе. - person morpheus05; 27.07.2013

FileWriter не буферизуется, вы должны использовать BufferedWriter в качестве оболочки:

final int myBufferSize = 2048;

Writer myWriter = new BufferedWriter(new FileWriter, myBufferSize);
person pocoLoco    schedule 27.07.2013
comment
как насчет размера буфера по умолчанию? - person Rollerball; 27.07.2013
comment
Неверно, API FileWriter говорит: Writes text to character files using a default buffer size. - person mrbela; 14.01.2019