Использует ли FileWriter буфер? (действует как в моем примере) - PullRequest
6 голосов
/ 24 мая 2011


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

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

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

Ответы [ 4 ]

12 голосов
/ 24 мая 2011

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

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

(мой акцент)

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

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

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

(мой акцент)

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

5 голосов
/ 24 мая 2011

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

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

0 голосов
/ 07 августа 2013

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

<code>"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")));
"
0 голосов
/ 24 мая 2011

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

Класс StreamEncoder.CharsetSE внутренне используется в OutputStreamWriter, а inturn внутренне используется FileWriter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...