Textpad также работает хорошо во вводных файлах тот размер. Я много раз делал его, имея необходимость иметь дело с чрезвычайно большими файлами журнала в 3-5gb диапазоне. Кроме того, использование grep, чтобы вытащить стоящие строки и затем посмотреть на тех работает отлично.
Писатели и потоки обычно буферизуют некоторые из ваших выходных данных в памяти и пытаются записывать его большими блоками за раз. очистка вызовет немедленную запись на диск из буфера, поэтому в случае сбоя программы эти данные не будут потеряны. Конечно, нет никакой гарантии, так как диск может физически не сразу записать данные, поэтому они все равно могут быть потеряны. Но тогда это будет не ошибка программы Java :)
PrintWriters автоматически сбрасывается (по умолчанию), когда вы пишете конец строки, и, конечно, потоки и буферы сбрасываются, когда вы их закрываете. Кроме этого, очистка происходит только при заполнении буфера.
Я настоятельно рекомендую уравнять флеш перед закрытием. В основном он записывает оставшиеся буферизованные данные в файл.
Если вы вызываете flush
явно, вы можете быть уверены, что любое IOException
, выходящее из close
, действительно катастрофично и связанных с освобождением системных ресурсов.
Когда вы очищаете
самостоятельно, вы можете обрабатывать его IOException
так же, как вы обрабатываете свои исключения записи данных.
FileWriter
является злым классом, поскольку он выбирает любой набор символов, который случайно присутствует, вместо того, чтобы брать явный набор символов. Даже если вам все-таки нужно значение по умолчанию, укажите это явно.
Обычное решение - OutputStreamWriter
и FileOutputStream
. Декоратор может вызвать исключение. Следовательно, вам нужно иметь возможность закрыть поток, даже если писатель никогда не создавался. Если вы собираетесь это сделать, вам нужно только очистить писатель (в счастливом случае) и всегда закрывать поток. (Чтобы сбить с толку, некоторые декораторы, например, для обработки zip-архивов, имеют ресурсы, требующие закрытия.)
Чтобы ответить на ваш вопрос о том, что на самом деле делает флеш, он гарантирует, что все, что вы записали в поток - файл в вашем случае - действительно записывается в файл тут же.
Java может выполнять буферизацию, что означает, что она будет удерживать данные, записанные в памяти, до тех пор, пока они не достигнут определенного количества, а затем записывать все это в файл за один раз, что более эффективно. Обратной стороной этого является то, что файл не обязательно является актуальным в любой момент времени. Flush - это способ сказать: «Обновите файл.
Close вызывает flush сначала, чтобы гарантировать, что после закрытия файл имеет то, что вы ожидаете увидеть в нем, следовательно, как указывали другие, нет необходимости промыть перед закрытием.
Нет смысла вызывать flush () непосредственно перед close (), как говорили другие. Время использовать flush () - это если вы оставляете файл открытым, но хотите убедиться, что предыдущая запись была полностью завершена.
Закрытие автоматически промывается. Вам не нужно называть это.
Как уже говорилось, обычно сбрасывать не нужно.
Это имеет смысл только в том случае, если по какой-то причине вы хотите, чтобы другой процесс увидел полное содержимое файла, который вы работая, не закрывая его. Например, его можно использовать для файла, который одновременно изменяется несколькими процессами, хотя и с БОЛЬШОЙ осторожностью: -)
Вам не нужно выполнять сброс, потому что close () сделает это за вас.
Из документации javadoc:
«Закройте поток, сначала очистив его. поток был закрыт, дальнейшие вызовы write () или flush () вызовут исключение IOException. Однако закрытие ранее закрытого потока не имеет никакого эффекта "