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


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

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

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

4 ответов


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

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

(Курсив мой)

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

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

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

(Курсив мой)

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


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

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


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

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


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

"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>"