флеш в java.io.FileWriter - PullRequest
       24

флеш в java.io.FileWriter

29 голосов
/ 16 ноября 2009

У меня есть вопрос, что при записи в файл перед завершением мы должны включить flush () ??.Если так, что он будет делать именно?не потоки автоматического сброса ??РЕДАКТИРОВАТЬ:

Итак, что это на самом деле?

Ответы [ 9 ]

22 голосов
/ 16 ноября 2009

Записывающие устройства и потоки обычно буферизируют некоторые ваши выходные данные в памяти и пытаются записывать их большими блоками за раз. сброс приведет к немедленной записи на диск из буфера, поэтому в случае сбоя программы эти данные не будут потеряны. Конечно, нет никакой гарантии, поскольку диск не может физически записать данные сразу, поэтому они все еще могут быть потеряны. Но тогда это не будет ошибкой программы Java:)

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

21 голосов
/ 16 ноября 2009

Я бы настоятельно рекомендовал колл флеш перед закрытием. В основном он записывает оставшиеся буферизованные данные в файл.

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

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

13 голосов
/ 16 ноября 2009

Вам не нужно делать сброс, потому что close () сделает это за вас.

Из Javadoc:

«Закройте поток, сначала очистив его. После закрытия потока дальнейшие вызовы write () или flush () вызовут IOException. Закрытие ранее закрытого потока, однако, не имеет никакого эффекта».

4 голосов
/ 16 ноября 2009

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

Java может выполнять буферизацию, что означает, что она будет удерживать данные, записанные в памяти, до тех пор, пока не наберет определенное количество, а затем записать все это в файл за один раз, что более эффективно. Недостатком этого является то, что файл не обязательно обновлен в любой момент времени. Flush - это способ сказать "сделайте файл обновленным.

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

3 голосов
/ 16 ноября 2009

Закрыть автоматически сбрасывает. Вам не нужно это называть.

1 голос
/ 22 октября 2013

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

while (true) {
  computeStuff();
  progresss += 1;
  out.write(String.format("%d", progress));
  out.flush();
}
out.close();
1 голос
/ 16 ноября 2009

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

Обычное решение - OutputStreamWriter и FileOutputStream. Декоратор может выдать исключение. Следовательно, вы должны иметь возможность закрыть поток, даже если писатель никогда не создавался. Если вы собираетесь это сделать, вам нужно только очистить писателя (в счастливом случае) и всегда закрывать поток. (Просто чтобы запутать, некоторые декораторы, например, для обработки почтовых индексов, имеют ресурсы, которые требуют закрытия.)

1 голос
/ 16 ноября 2009

Как уже говорилось, вам обычно не нужно сбрасывать.

Это имеет смысл, только если по какой-то причине вы хотите, чтобы другой процесс увидел полное содержимое файла, с которым вы работаете, без его закрытия. Например, его можно использовать для файла, который одновременно изменяется несколькими процессами, хотя и с ОЧЕНЬ большой осторожностью: -)

1 голос
/ 16 ноября 2009

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

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