una remoto que por not interrupción found forzado existente exceptions conexión java exception file-io

que - java.io.ioexception se ha forzado la interrupción de una conexión existente por el host remoto



¿Alguna vez has visto un archivo Java close() lanzar una excepción? (8)

¿Alguien ha visto alguna vez una excepción cuando llama al método Cerrar en cualquier objeto que se puede cerrar?


No en términos de archivo-io, pero en términos de sockets, el cierre elevará IOException cuando el otro lado haya abortado la conexión. Por ejemplo, cuando lanza una solicitud HTTP en una página web (grande) y luego navega de inmediato haciendo clic en otro enlace en la página web (mientras no está terminada de cargarse), el lado del servidor obtendrá una IOException (o una subclase como ClientAbortException en servidores y clones de Tomcat) cuando el flujo de salida de la respuesta HTTP se va a purgar / cerrar.


No lo hice, pero es posible. Imagínese si hay un OutputStream que por algún motivo aún no haya escrito en el archivo. Bueno, al llamar a close() se eliminarán los datos, pero si el archivo está bloqueado, se IOException una IOException .


Pruebe tirando de una unidad USB con un archivo abierto. Si no da una excepción, estaría bastante sorprendido.


Publicación antigua y respondida hace tiempo, pero aquí hay un ejemplo real:

El siguiente código se excluirá cuando se invoque bufferedWriter.close (). Esto sucede porque el Escritor subyacente de BufferedWriter (el FileWriter) ya se ha cerrado y cuando un BufferedWriter se cierra, primero intenta vaciar cualquier información en su búfer a su Writer subyacente.

File newFile = new File("newFile.txt"); FileWriter fileWriter = new FileWriter(newFile); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); bufferedWriter.write("Hello World"); fileWriter.close(); bufferedWriter.close();

Nota : si no hay datos en el búfer [comente la línea write () o agregue una llamada flush ()] no se generará ninguna excepción


Sí, no es tan raro, en mi humilde opinión, si está trabajando con algo más que archivos de disco no locales.

Close () funciona si en ese momento su cerrable sigue siendo válido y abierto. Muchas cosas como tuberías, archivos remotos, etc., pueden morir prematuramente.

Además, he visto código que ignora los errores al abrir y escribir y aún intenta cerrarse (por ejemplo, en un bloque finally).


Supongo que podrías intentar forzar esto desenchufando el disco en el que está tu archivo. Pero en cualquier Closable ? Creo que sería fácil obtener algo que use un socket para lanzar una excepción al cerrar.


Tengo - en mi unidad pruebas contra burlas;)


Una IOException lanzará de close si falla el flush final. Las posibles causas incluyen:

  • el sistema de archivos está lleno, o el usuario está por encima de la cuota,
  • errores de disco duro,
  • un sistema de archivos fue desmontado a la fuerza,
  • un sistema de archivos remoto no está disponible debido a una red u otros problemas,
  • (posiblemente) un error de codificación de caracteres si escribe en el archivo a través de un OutputStreamWriter o similar,
  • un error de dispositivo si el "archivo" es un archivo de dispositivo,
  • una conexión perdida si el cierre es una transmisión de red,
  • una tubería rota si el cierre es una tubería para un proceso externo,
  • y así.

Ciertamente he visto algunos de estos. Otros son poco probables.

Sin embargo, si los datos que está escribiendo son importantes, entonces debe permitir fallas close . Por ejemplo, si su aplicación está escribiendo un archivo crítico, el sistema de archivos se llena, su aplicación debería notar esto antes de reemplazar la copia anterior del archivo con la versión truncada.