Qual è lo scopo di flush () nei flussi Java?


121

In Java, il flush()metodo viene utilizzato nei flussi. Ma non capisco a cosa servono tutti questi metodi?

fin.flush();

dimmi qualche suggerimento.

Risposte:


101

Dai documenti del flushmetodo:

Svuota il flusso di output e forza la scrittura dei byte di output memorizzati nel buffer. Il contratto generale di flush è che chiamarlo è un'indicazione che, se qualsiasi byte scritto in precedenza è stato bufferizzato dall'implementazione del flusso di output, tali byte dovrebbero essere scritti immediatamente nella destinazione prevista.

Il buffering viene eseguito principalmente per migliorare le prestazioni di I / O. Maggiori informazioni su questo possono essere lette da questo articolo: Ottimizzazione delle prestazioni di I / O Java .


1
Nuovo collegamento a Tuning Java I / O Performance oracle.com/technetwork/articles/javase/perftuning-137844.html
Oleksandr

+1 Grazie. Non sono riuscito a capire perché i miei byte non sono stati inviati, ed è perché ho dovuto svuotare i miei buffer.
rayryeng

3
Il metodo flush viene utilizzato solo con flussi bufferizzati? c'è qualche vantaggio nell'usarlo anche con altri flussi (es. outputstream)?
tnishada

Forse la parola "flush" non dovrebbe essere nella sua definizione. Le definizioni ricorsive sono una cattiva idea per capire cose nuove. Sono consapevole che non hai scritto la definizione.
Jonathan Komar

27

Quando diamo un comando, i flussi di quel comando vengono memorizzati nella posizione di memoria chiamata buffer (una posizione di memoria temporanea) nel nostro computer. Quando tutta la posizione di memoria temporanea è piena, utilizziamo flush (), che scarica tutti i flussi di dati e li esegue completamente e dà un nuovo spazio ai nuovi flussi nella posizione temporanea del buffer. -Spero che tu capisca


1
Solo nel caso di BufferedOutputStream, BufferedWriter, ObjectOutputStream,e le PrintXXXclassi. Il flush()metodo di qualsiasi altro flusso o Writernon fa nulla.
Marchese di Lorne

@EJP Qualche riferimento per eseguire il backup delle tue dichiarazioni? Sarebbe utile per noi neofiti :)
mr5

1
@ mr5 È il poster che ha bisogno di sostenere le sue affermazioni, non io, ma tutto ciò che ho detto è dichiarato chiaramente nel Javadoc
Marquis of Lorne

Invocare flush()esplicitamente non è richiesto per un BufferedWriter, purché tu close()lo scrittore. close()esegue esso stesso un flush.
Yossarian42

Nota le close()chiamate flush(), quindi chiamare entrambi è ridondante quando si usa FileWritersenza buffer.
Yossarian42

26

Quando si scrivono dati in un flusso, questi non vengono scritti immediatamente e vengono memorizzati nel buffer. Quindi usalo flush()quando devi essere sicuro che tutti i tuoi dati dal buffer siano scritti.

Dobbiamo essere sicuri che tutte le scritture siano state completate prima di chiudere lo stream, ed è per questo che flush()viene chiamato in file / buffered writer's close().

Ma se hai la necessità di salvare tutte le tue scritture in qualsiasi momento prima di chiudere lo stream, usa flush().


8
Chiamare flush appena prima della chiusura è ridondante, giusto? è lo stesso che chiamare semplicemente close.
John Henckel

2
@BimanTripathy posso dirlo con una certezza del 100%. È garantito dal Javadoc di FilterOutputStreame FilterWriter.
Marchese di Lorne

7

Se il buffer è pieno, tutte le stringhe memorizzate su di esso verranno salvate sul disco. Buffer è usato per evitare grandi affari! e sopra la testa.

Nella classe BufferedWriter che si trova nelle librerie java, c'è una riga come:

private static int defaultCharBufferSize = 8192;

Se vuoi inviare i dati prima che il buffer sia pieno, hai il controllo. Basta sciacquarlo. Chiamate a writer.flush () dicono, "invia tutto ciò che è nel buffer, ora!

libro di riferimento: https://www.amazon.com/Head-First-Java-Kathy-Sierra/dp/0596009208

pagine: 453


4

Gli stream sono spesso accessibili da thread che periodicamente svuotano il loro contenuto e, ad esempio, lo visualizzano sullo schermo, lo inviano a un socket o lo scrivono su un file. Questo viene fatto per motivi di prestazioni. Scaricare un flusso di output significa che si desidera interrompere, attendere che il contenuto del flusso sia completamente trasferito alla sua destinazione, quindi riprendere l'esecuzione con il flusso vuoto e il contenuto inviato.


5
Questa è fantasia. I flussi non sono accessibili da alcun thread magico; solo quelli creati dall'applicazione.
Marchese di Lorne,

3

Per problemi di prestazioni, i primi dati devono essere scritti nel buffer. Quando il buffer si riempie, i dati vengono scritti nell'output (file, console ecc.). Quando il buffer è parzialmente pieno e si desidera inviarlo all'output (file, console), è necessario chiamare manualmente il metodo flush () per scrivere un buffer parzialmente pieno nell'output (file, console).


Questo non è vero. FileOutputStream.flush () è un no-op vuoto.
vertuso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.