java — использует ли FileWriter буфер? (он действует так же, как в моем примере)


Я использую FileWriter и заметил странное поведение. Я сам буферизирую свою коллекцию и каждые x строк, которые я использую

 IOUtils.writelines(myList,"\n", writer );

В файл не пишет. Я продолжаю вызывать его с большим количеством строк, и только после того, как он очень заполнен, он записывает в файл.
Использует ли он буфер? Я не могу найти его в документации.


person Bick    schedule 24.05.2011    source источник


Ответы (4)


Во втором предложении обзора FileWriter класса говорится:

Конструкторы этого класса предполагают, что кодировка символов по умолчанию и размер байтового буфера по умолчанию являются приемлемыми. Чтобы указать эти значения самостоятельно, создайте OutputStreamWriter в FileOutputStream.

(выделено мной)

Так что ясно, что он буферизован (если только размер байтового буфера по умолчанию не равен нулю, и они действительно странные со своей формулировкой).

Я подозреваю, что это просто использование OutputStreamWriter на FileOutputStream. Глядя на OutputStreamWriter:

Каждый вызов метода write() приводит к вызову преобразователя кодировки для данного символа(ов). Результирующие байты накапливаются в буфере перед записью в базовый поток вывода.

(выделено мной)

Если вы хотите убедиться, что различные буферы на разных уровнях очищаются, насколько это возможно, рассмотрите использование flushметод.

person T.J. Crowder    schedule 24.05.2011
comment
Спасибо за развернутый ответ. - person Bick; 24.05.2011
comment
@user: Не беспокойтесь, надеюсь, это помогло. - person T.J. Crowder; 24.05.2011
comment
Спасибо за указание на это. Я также пропустил это в документах и ​​был очень сбит с толку, когда tail не показывал мои записи! - person Hamy; 29.09.2014

Я подозреваю, что это деталь реализации, но я ожидаю, что большинство реализаций будут использовать буфер, да. Вы, конечно, не должны полагаться на отсутствие буферизации. Когда вы очищаете или закрываете писатель, все должно быть в порядке.

Обратите внимание, что лично мне не нравится использовать FileWriter, поскольку он не позволяет вам указывать кодировку символов — вместо этого я обычно заключаю FileOutputStream в OutputStreamWriter.

person Jon Skeet    schedule 24.05.2011

Посмотрите на класс sun.nio.cs.StreamEncoder.CharsetSE.implWrite(). Он использует ByteBuffer.

Класс StreamEncoder.CharsetSE внутренне используется OutputStreamWriter, который, в свою очередь, внутренне используется FileWriter.

person Suraj Chandran    schedule 24.05.2011

Кажется, что он использует буфер, но каким-то другим образом (низкоуровневый, буфер может быть пустым по умолчанию). Нужно обернуть его BufferedWriter. Из Javadoc BufferedWriter:

"In general, a Writer sends its output immediately to the underlying
 character or byte stream.  Unless prompt output is required, it is advisable
 to wrap a BufferedWriter around any Writer whose write() operations may be
  costly, such as FileWriters and OutputStreamWriters.  For example,

  <pre>
  PrintWriter out
    = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
  </pre>"
person Alexey    schedule 07.08.2013