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.
Tú deberclose()
tu BufferedWriter
. Debes close()
tu BufferedWriter
Porque es un Writer
y por lo tanto implementa AutoCloseable
lo 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 close
y 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 BufferedWriter
se 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 deflush()
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.