Java IO, para que serve o flush()?

copiei esse codigo de um post do guj, percebi que funciona com ou sem o flush… não entendo para que ele serve…

[code]private static final String path = “c:\teste6.txt”;

    public static void main(String[] args) throws IOException {  
        File file = new File(path);  
        
        // Cria o arquivo se não existir
        BufferedWriter writer = new BufferedWriter(new FileWriter(file));  
        writer.write("Arquivo gravado em : " + new SimpleDateFormat("dd/MM/yyyy hh:mm:ss").format(new Date()));  
        writer.newLine();  
        writer.newLine();  
        writer.newLine();  

        writer.newLine();  
        writer.write("Caminho da dfasfsadfasdfadsfadsfasdfasdfsadfsdafsdafdsfadsfasdfdasff: " + path);  
        
        //Criando o conteúdo do arquivo  
       // writer.flush();  
        
        //Fechando conexão e escrita do arquivo
        writer.close();  
          
        System.out.println("Arquivo gravado em: " + path);  
    }  [/code]

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.

Antigamente, no guj, era costume perguntar “Já leu a API?”
E funcionava…

flus = descarga

da uma olhada aqui

http://docs.oracle.com/javase/1.4.2/docs/api/java/io/BufferedWriter.html#flush()

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().

Segundo a documentação:
Closes the stream, flushing it first.

É válido para o Writer, mas não para o OutputStream:
http://docs.oracle.com/javase/6/docs/api/java/io/OutputStream.html#close()

Observe que alguns OutputStreams, como o PrintStream, dizem que fecham. Outros não.

Por isso é bom não dar isso como garantido.

Certo, estava a falar para o caso específico deste exemplo.

nossa, obrigadaa

sera que podia me ajudar no post?