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