¿Cuál es el propósito de flush () en los flujos de Java?

121

En Java, flush() método se usa en secuencias. Pero no entiendo cuál es el propósito de usar este método.

fin.flush();

dime algunas sugerencias.

Venkat
fuente

Respuestas:

101

De los documentos del flushmétodo:

Vacía el flujo de salida y fuerza la escritura de los bytes de salida almacenados en búfer. El contrato general de flush es que llamarlo es una indicación de que, si los bytes escritos previamente han sido almacenados en búfer por la implementación del flujo de salida, dichos bytes deben escribirse inmediatamente en su destino previsto.

El almacenamiento en búfer se realiza principalmente para mejorar el rendimiento de E / S. Puede leer más sobre esto en este artículo: Ajuste del rendimiento de E / S de Java .

codaddict
fuente
1
Enlace nuevo para ajustar el
Oleksandr
+1 Gracias. No pude entender por qué no se enviaron mis bytes, y es porque tuve que vaciar mis búferes.
rayryeng
3
¿El método de descarga solo se usa con flujos almacenados en búfer? ¿Existe alguna ventaja de usarlo con otros flujos (por ejemplo, flujo de salida) también?
tnishada
Quizás la palabra 'flush' no debería estar en su definición. Las definiciones recursivas son una mala idea para comprender cosas nuevas. Soy consciente de que no escribió la definición.
Jonathan Komar
27

Cuando damos cualquier comando, las secuencias de ese comando se almacenan en la ubicación de memoria llamada búfer (una ubicación de memoria temporal) en nuestra computadora. Cuando toda la ubicación de la memoria temporal está llena, usamos flush (), que vacía todos los flujos de datos y los ejecuta por completo y da un nuevo espacio a los nuevos flujos en la ubicación temporal del búfer. -Espero que lo entiendas

usuario3004437
fuente
1
Sólo en el caso de BufferedOutputStream, BufferedWriter, ObjectOutputStream,y las PrintXXXclases. El flush()método de cualquier otra corriente o Writerno hace nada.
Marqués de Lorne
@EJP ¿Alguna referencia para respaldar sus declaraciones? Sería útil para nosotros los novatos :)
mr5
1
@ mr5 Es el póster quien necesita respaldar sus declaraciones, no yo, pero todo lo que he dicho está expresado claramente en el Javadoc
Marqués de Lorne
flush()No se requiere invocar explícitamente para a BufferedWriter, siempre y cuando usted sea close()el escritor. close()ejecuta una descarga por sí mismo.
Yossarian42
Note las close()llamadas flush(), por lo que llamar a ambos es redundante cuando se usa FileWritersin búfer.
Yossarian42
26

Cuando escribe datos en una secuencia, no se escribe inmediatamente y se almacena en búfer. Por lo tanto, utilícelo flush()cuando necesite asegurarse de que todos los datos del búfer estén escritos.

Necesitamos asegurarnos de que todas las escrituras se completen antes de cerrar la secuencia, y es por eso que flush()se llama en el archivo / escritor en búfer close().

Pero si tiene el requisito de que todas sus escrituras se guarden en cualquier momento antes de cerrar la transmisión, use flush().

Tripatía de Biman
fuente
8
Llamar a flush justo antes del cierre es redundante, ¿verdad? es lo mismo que simplemente llamar a close.
John Henckel
2
@BimanTripathy Puedo decir eso con 100% de seguridad. Está garantizado por el Javadoc de FilterOutputStreamy FilterWriter.
Marqués de Lorne
7

Si el búfer está lleno, todas las cadenas almacenadas en él se guardarán en el disco. ¡Los búferes se utilizan para evitar grandes ofertas! y arriba.

En la clase BufferedWriter que se coloca en las bibliotecas de Java, hay una línea como:

private static int defaultCharBufferSize = 8192;

Si desea enviar datos antes de que se llene el búfer, tiene el control. Simplemente enjuague. Las llamadas a writer.flush () dicen, "envía lo que esté en el búfer, ¡ahora!

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

páginas: 453

Semih Okan Pehlivan
fuente
4

A menudo se accede a las transmisiones mediante hilos que periódicamente vacían su contenido y, por ejemplo, lo muestran en la pantalla, lo envían a un socket o lo escriben en un archivo. Esto se hace por motivos de rendimiento. Vaciar un flujo de salida significa que desea detenerse, esperar a que el contenido del flujo se transfiera por completo a su destino y luego reanudar la ejecución con el flujo vacío y el contenido enviado.

Silvio Donnini
fuente
5
Esto es fantasía. Los hilos mágicos no acceden a las corrientes; solo los creados por la aplicación.
Marqués de Lorne
3

Por cuestiones de rendimiento, los primeros datos deben escribirse en Buffer. Cuando el búfer se llena, los datos se escriben en la salida (archivo, consola, etc.). Cuando el búfer está parcialmente lleno y desea enviarlo a la salida (archivo, consola), debe llamar al método flush () manualmente para escribir el búfer parcialmente lleno en la salida (archivo, consola).

vijaya kumar
fuente
Esto no es verdad. FileOutputStream.flush () es un no-op vacío.
Vertuso