descargar - java offline
¿Es seguro usar java.io.BufferedOutputStream? (1)
A primera vista este código parece completamente correcto.
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("1.txt"));
byte[] bytes = new byte[4096];
bout.write(bytes);
bout.close();
pero si observamos de cerca, veremos que close()
se implementa de la siguiente manera
public void close() throws IOException {
try {
flush();
} catch (IOException ignored) {
}
out.close();
}
¿Es posible que, debido a que flush()
errores se flush()
datos se pierdan y el programa no lo note? No se menciona ningún peligro en FilterOutputStream.close
(donde BufferedOutputStream
hereda la API close()
from).
ACTUALIZACIÓN: para simular un error de E / S durante el cierre (), cambié la prueba para escribir en una memoria Flash, agregué un descanso de 5 segundos antes de bout.close () y mientras la prueba estaba durmiendo, quité el Flash del USB. La prueba terminó sin excepciones, pero cuando inserté el Flash y lo revisé, 1.txt no estaba allí.
Entonces anulé cerca ()
BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream("g:/1.txt")) {
@Override
public void close() throws IOException {
flush();
super.close();
}
};
y corrió la prueba de nuevo y consiguió
Exception in thread "main" java.io.FileNotFoundException: g:/1.txt (The system cannot the specified path)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:212)
at java.io.FileOutputStream.<init>(FileOutputStream.java:104)
at test.Test1.main(Test1.java:10)
Tal como está, razonaría que el hecho de llamar de close
puede hacerte perder datos, ya que esa posible IOException
se ignora silenciosamente (quien en la tierra sabe lo que pasó por la mente de los desarrolladores para hacer eso ...).
Una alternativa decente, aunque pone el esfuerzo del lado del programador, es llamar a flush
explícitamente antes de close
(manejar la posible IOException
correctamente), como se menciona en un comentario de @Tom, particularmente en un bloque try/finally
.
Este problema se puede exacerbar aún más en Java7, debido a los objetos de AutoCloseable
, ya que no llamará explícitamente al método close()
y este tipo de solución es aún más fácil de resolver.