У меня есть вопрос, на мой взгляд, что, записывая в файл, перед закрытием мы должны включить flush()??. Если да, то что он будет делать точно? dont streams auto flush?? EDIT:
Так флеш, что он на самом деле делает?
У меня есть вопрос, на мой взгляд, что, записывая в файл, перед закрытием мы должны включить flush()??. Если да, то что он будет делать точно? dont streams auto flush?? EDIT:
Так флеш, что он на самом деле делает?
Писатели и потоки обычно накапливают некоторые ваши выходные данные в памяти и пытаются записать их в больших блоках за раз. промывка приведет к немедленной записи на диск из буфера, поэтому, если программа выйдет из строя, данные не будут потеряны. Разумеется, нет никакой гарантии, поскольку диск не может физически быстро записать данные, поэтому он все равно может быть потерян. Но тогда это не будет ошибка программы Java:)
PrintWriters автоматически сбрасывает (по умолчанию), когда вы пишете конец строки, и, конечно, потоки и буферы очищаются при закрытии. Кроме этого, происходит промывка только тогда, когда буфер заполнен.
Я бы очень рекомендовал вызвать flush перед закрытием. В основном он записывает оставшиеся буферные данные в файл.
Если вы вызываете flush
явно, вы можете быть уверены, что любой IOException
, выходящий из close
, действительно катастрофичен и связан с выпуском системных ресурсов.
Когда вы flush
самостоятельно, вы можете обрабатывать его IOException
так же, как вы обрабатываете исключения записи данных.
Вам не нужно делать флеш, потому что close() сделает это за вас.
Из javadoc:
"Закройте поток, сначала промойте его. Когда поток будет закрыт, последующие вызовы write() или flush() вызовут исключение IOException. Однако закрытие ранее закрытого потока не влияет".
Чтобы ответить на вопрос о том, что на самом деле делает флеш, он гарантирует, что все, что вы написали в потоке, - файл в вашем случае, действительно записывается в файл там и потом.
Java может выполнять буферизацию, что означает, что она будет хранить данные, записанные в памяти, до тех пор, пока она не будет иметь определенную сумму, а затем напишет все это в файл за один раз, что будет более эффективным. Недостатком этого является то, что файл не обязательно обновляется в любой момент времени. Flush - это способ сказать "сделать файл актуальным".
Закрыть вызовы flush сначала, чтобы убедиться, что после закрытия файла есть то, что вы ожидаете увидеть в нем, поэтому, как указывали другие, не нужно скрывать перед закрытием.
Закрыть автоматически сбрасывается. Вам не нужно его вызывать.
Нет смысла вызывать flush() перед закрытием(), как говорили другие. Время использования flush() - это если вы держите файл открытым, но хотите, чтобы предыдущие записи были полностью завершены.
Как уже говорилось, вам обычно не нужно скрывать.
Это имеет смысл, если по какой-то причине вы хотите, чтобы другой процесс увидел полное содержимое файла, с которым вы работаете, без его закрытия. Например, он может использоваться для файла, который одновременно модифицируется несколькими процессами, хотя с большим вниманием: -)
FileWriter
является злым классом, так как он выбирает все, что набор символов существует, вместо того, чтобы принимать явную кодировку. Даже если вы действительно хотите по умолчанию, будьте откровенны.
Обычное решение OutputStreamWriter
и FileOutputStream
. Декоратору можно исключить исключение. Поэтому вы должны иметь возможность закрыть поток, даже если писатель никогда не был построен. Если вы собираетесь это сделать, вам нужно только очистить писателя (в счастливом случае) и всегда закрыть поток. (Чтобы просто ввести в заблуждение, некоторые декораторы, например, для обработки почтовых индексов, имеют ресурсы, которые требуют закрытия.)
Еще одна утилита для промывки в программе - это запись прогресса долговременной работы в файл (поэтому ее можно остановить и перезапустить позже). Вы хотите быть уверенным, что данные на диске безопасны.
while (true) {
computeStuff();
progresss += 1;
out.write(String.format("%d", progress));
out.flush();
}
out.close();