2011-05-24 1 views
6


Я использую FileWriter, и я заметил странное поведение. я буферные свою коллекцию я и каждые х строк я используюjava - Использует ли FileWriter буфер? (он действует, как в моем примере)

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

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

ответ

12

Второе предложение the FileWriter class overview говорит:

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

(курсив мой)

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

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

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

(курсив мой)

Если вы хотите, чтобы гарантировать, что различные буферы на различных уровнях вымываются, в той мере, вы можете, смотреть на использовании flush method.

+0

Спасибо за уточненной ответ. – Jeb

+0

@user: Не беспокойтесь, надеюсь, что это помогло. –

+0

Спасибо, что указали это. Я также пропустил это в документах и ​​был действительно смущен, когда 'tail' не показывал мои записи! – Hamy

5

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

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

0

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

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

0

Кажется, что он использует буфер, но каким-то другим способом (низкоуровневый буфер может быть пустым по умолчанию). Нужно обернуть его 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>" 

 Смежные вопросы

  • Нет связанных вопросов^_^