Java IO, para que serve o flush()?

9 respostas
M

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

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);  
	    }

9 Respostas

R

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.

D

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

P

flus = descarga

da uma olhada aqui

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

P

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.

V

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

P

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

V

É 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.

P

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

M

nossa, obrigadaa

sera que podia me ajudar no post?

Criado 15 de janeiro de 2013
Ultima resposta 15 de jan. de 2013
Respostas 9
Participantes 6