Saltar al contenido

BufferedWriter no escribe todo en su archivo de salida

Al fin después de mucho trabajar ya hallamos el resultado de esta obstáculo que ciertos los usuarios de esta web han presentado. Si quieres aportar alguna información no dudes en aportar tu comentario.

Solución:

Tienes que cerrar tu OutputStream que vaciará el resto de sus datos:

out.close();

El tamaño de búfer predeterminado para BufferedWriter tiene 8192 caracteres, lo suficientemente grande como para contener fácilmente cientos de líneas de datos no escritos.

deberclose() tu BufferedWriter. Debes close() tu BufferedWriter Porque es un Writer y por lo tanto implementa AutoCloseablelo que significa (énfasis añadido) es

un recurso que debe estar cerrado cuando ya no se necesita.

Algunas personas dicen que primero debes llamar flush() para tu BufferedWriter antes de llamar close(). Están equivocados. la documentación para BufferedWriter.close() señala que “cierra la corriente, enjuagándolo primero” (énfasis añadido).

La semántica documentada de flushing (flush()) están

Vacía este flujo escribiendo cualquier salida almacenada en búfer en el flujo subyacente

Entonces, debes closey close vaciará cualquier salida almacenada en búfer.

Su archivo de salida no incluye todo el texto que escribió en su BufferedWriter porque almacenó parte de ese texto en un búfer. los BufferedWriter nunca vació ese búfer, pasándolo al archivo, porque nunca le dijo que lo hiciera.


Desde Java 7, la mejor forma de garantizar un AutoCloseable recurso, como un BufferedWriterse cierra cuando ya no es necesario utilizar la gestión automática de recursos (ARM), también conocida como prueba con recursos:

 try (BufferedWriter out = new BufferedWriter(new FileWriter(file))) 
    // writes to out here
  catch (IOException ex) 
    // handle ex
 

Usted también debe close tu BufferedReader cuando ya no sea necesario, por lo que debería haber anidado bloques de prueba con recursos:

 try (BufferedReader in = new BufferedReader(new FileReader("nyccrash.txt")) 
    try (BufferedWriter out = new BufferedWriter(new FileWriter("nyccrash.sql"))) 
       // your reading and writing code here
    
  catch (IOException ex) 
    // handle ex
 

No se sienta tentado (como sugieren otras respuestas aquí) solo para llamar close() al final de su método, cuando su código haya “terminado” usando el escritor. Eso no funcionará si su código de escritura arroja una excepción, y en particular si arroja un IOException.

Un recurso que debe cerrarse cuando ya no se necesita.

finally 
    out.close();//this would resolve the issue
    

Algunas cosas a considerar:

  • BufferedWriter.close()vacía el búfer a la secuencia subyacenteasí que si te olvidas de flush() y no cierre, es posible que su archivo no tenga todo el texto que escribió.
  • BufferedWriter.close() también cierra el Writer envuelto. Cuando se trata de un FileWriter, esto en última instancia, cierre un FileOutputStream y dígale al sistema operativo que ha terminado de escribir en el archivo.
  • El recolector de basura llamará automáticamente close(), no en BufferedWriter o FileWriter empaquetado, sino en FileOuputStream. Entonces, el sistema operativo estará feliz, pero debe esperar al GC.
  • Sin embargo, siempre quieres liberar recursos del sistema operativo tan pronto como ya no los necesite. Esto se aplica a archivos abiertos, conexiones a bases de datos, colas de impresión… cualquier cosa. Confía en mí esta vez.
  • BufferedWriter.close() limpia el búfer de caracteres interno, por lo que la memoria estará disponible para la recolección de elementos no utilizados, incluso mientras el propio BufferedWriter permanece dentro del alcance.

Por lo tanto, cierre siempre sus recursos (no solo los archivos) cuando haya terminado con ellos.

Si realmente quiere echar un vistazo debajo de las sábanas, la mayoría de las fuentes de la API de Java están disponibles. BufferedWriter está aquí.

Te mostramos comentarios y calificaciones

Tienes la opción de asentar nuestra publicación ejecutando un comentario o dejando una puntuación te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *