Qual é o objetivo de flush () nos fluxos Java?

120

Em Java, o flush()método é usado em fluxos. Mas não entendo qual é o objetivo de usar esse método?

fin.flush();

diga-me algumas sugestões.

Venkat
fonte

Respostas:

100

A partir dos documentos do flushmétodo:

Libera o fluxo de saída e força a gravação de quaisquer bytes de saída em buffer. O contrato geral de liberação é que chamá-lo é uma indicação de que, se quaisquer bytes gravados anteriormente tiverem sido armazenados em buffer pela implementação do fluxo de saída, esses bytes deverão ser gravados imediatamente no destino pretendido.

O buffer é feito principalmente para melhorar o desempenho de E / S. Pode ler mais sobre este artigo: Ajustando o desempenho de E / S do Java .

codaddict
fonte
1
Novo link para Ajustando o desempenho de E / S Java oracle.com/technetwork/articles/javase/perftuning-137844.html
Oleksandr
+1 Obrigado. Eu não conseguia descobrir por que meus bytes não foram enviados e é porque eu tive que liberar meus buffers.
rayryeng
3
O método de descarga é usado apenas com fluxos em buffer? existe alguma vantagem de usá-lo com outros fluxos (por exemplo, fluxo de saída) também?
tnishada
Talvez a palavra 'flush' não deva estar em sua definição. Definições recursivas são uma má idéia para entender coisas novas. Estou ciente de que você não escreveu a definição.
Jonathan Komar
27

Quando damos qualquer comando, os fluxos desse comando são armazenados no local da memória chamado buffer (um local de memória temporário) em nosso computador. Quando toda a localização da memória temporária está cheia, usamos flush (), que libera todos os fluxos de dados e os executa completamente e dá um novo espaço para novos fluxos no local temporário do buffer. -Espero que você entenda

user3004437
fonte
1
Apenas no caso de BufferedOutputStream, BufferedWriter, ObjectOutputStream,e as PrintXXXclasses. O flush()método de qualquer outro fluxo ou Writernão faz nada.
Marquês de Lorne
@EJP Alguma referência para fazer backup de suas declarações? Seria útil para nós iniciantes :)
MR5
1
@ MR5 Ele é o cartaz que precisa para fazer backup de suas declarações, não a mim, mas tudo o que eu disse é afirmado claramente no Javadoc
Marquês de Lorne
Invocar flush()explicitamente não é necessário para a BufferedWriter, contanto que você seja close()o escritor. close()executa um flush em si.
usar o seguinte
Observe as close()chamadas flush(), portanto, chamar ambas é redundante ao usar FileWritersem buffer.
usar o seguinte
26

Quando você grava dados em um fluxo, eles não são gravados imediatamente e são armazenados em buffer. Portanto, use flush()quando precisar ter certeza de que todos os seus dados do buffer estão gravados.

Precisamos ter certeza de que todas as gravações são concluídas antes de fecharmos o fluxo, e é por isso que flush()é chamado no arquivo / gravador em buffer close().

Mas se você tiver um requisito para que todas as suas gravações sejam salvas a qualquer momento antes de fechar o fluxo, use flush().

Biman Tripathy
fonte
8
Chamar flush imediatamente antes do fechamento é redundante, certo? é o mesmo que simplesmente fechar.
John Henckel
2
@BimanTripathy Posso dizer isso com 100% de garantia. É garantido pelo Javadoc de FilterOutputStreame FilterWriter.
Marquês de Lorne
7

Se o buffer estiver cheio, todas as strings nele armazenadas em buffer, elas serão salvas no disco. Buffers é usado para evitar grandes promoções! e sobrecarga.

Na classe BufferedWriter que é colocada nas bibliotecas java, há uma linha como:

private static int defaultCharBufferSize = 8192;

Se você deseja enviar dados antes que o buffer esteja cheio, você tem controle. Apenas lave-o. Chamadas para writer.flush () dizem: "envie o que estiver no buffer agora!

livro de referência: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

páginas: 453

Semih Okan Pehlivan
fonte
4

Os fluxos geralmente são acessados ​​por threads que periodicamente esvaziam seu conteúdo e, por exemplo, exibem na tela, enviam para um soquete ou gravam em um arquivo. Isso é feito por razões de desempenho. Liberar um fluxo de saída significa que você deseja parar, aguardar a transferência completa do conteúdo para o destino e, em seguida, retomar a execução com o fluxo vazio e o conteúdo enviado.

Silvio Donnini
fonte
5
Isso é fantasia. Os fluxos não são acessados ​​por nenhum encadeamento mágico; somente aqueles criados pelo aplicativo.
Marquês de Lorne
3

Para problemas de desempenho, os primeiros dados devem ser gravados no buffer. Quando o buffer fica cheio, os dados são gravados na saída (arquivo, console etc.). Quando o buffer está parcialmente preenchido e você deseja enviá-lo para a saída (arquivo, console), é necessário chamar o método flush () manualmente para gravar o buffer parcialmente preenchido na saída (arquivo, console).

vijaya kumar
fonte
Isso não é verdade. FileOutputStream.flush () é um no-op vazio.
vertuso 20/06