Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

Из Javadoc:

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

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

Java может выполнять буферизацию, что означает, что он будет хранить данные, записанные в памяти, до тех пор, пока не накопится определенный объем, а затем запишет их все в файл за один раз, что более эффективно.Обратной стороной этого является то, что файл не обязательно актуален в любой момент времени.Flush — это способ сказать «обновите файл».

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

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

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

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

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

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

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

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

while (true) {
  computeStuff();
  progresss += 1;
  out.write(String.format("%d", progress));
  out.flush();
}
out.close();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top