Enquanto você está escrevendo no arquivo, com o método write, essas alterações não estão realmente no arquivo ainda, quando você invoca o flush, você diz que quer enviar todos os seu conteúdo naquele momento.
Acontece que o flush é chamado implicitamente, você não precisa realmente invocar esse método em todas as situações, como seu exemplo é simples provavelmente sempre vai funcionar sem o flush, agora em um ambiente mais complexo, talvez você perca dados no meio do caminho.
A boa prática é deixar o flush ali, mesmo que você ache que não precise, nunca se sabe quando um byte pode ficar para trás.
O flush é para obrigar realmente a escrever os dados para disco. O write apenas os escreve para um buffer que depois escreve então para disco.
Ao chamar o flush dizes que nesse momento queres forçar que todo o conteúdo do buffer seja efectivamente escrito em disco. O close já chama o flush pelo que no teu caso o flush é desnecessário.
Cuidado, embora o flush() seja chamado ocasionalmente, não há garantias de quando. Inclusive, a assinatura do método close() não garante que será dado flush() antes do fechamento do stream (um erro na minha opinião). E o duro é que muitas classes não dão esse flush().