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