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.

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 .


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


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


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


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.


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


Isso não é verdade. FileOutputStream.flush () é um no-op vazio.
vertuso 20/06
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.