initialize example create java outputstream java-io

java - example - Cómo comprobar si un OutputStream está cerrado



outputstream java example (6)

¿Hay alguna forma de comprobar si OutputStream está cerrado sin intentar escribir en él y detectar la IOException ?

Por ejemplo, considere el siguiente método artificial:

public boolean isStreamClosed(OutputStream out){ if( /* stream isn''t closed */){ return true; }else{ return false; } }

¿Con qué podría reemplazar /* stream isn''t closed */ con?


Desafortunadamente, la API de OutputStream no tiene un método como isClosed() .

Por lo tanto, solo conozco una manera clara: cree su clase StatusKnowingOutputStream que envuelva cualquier otra secuencia de salida e implemente su método close() siguiente manera:

public void close() { out.close(); closed = true; }

Ahora agregue el método isClosed()

public boolean isClosed() { return closed; }


El OutputStream en sí no admite tal método. La interfaz de Closable se define de manera que una vez que llama a close (), va a eliminar ese OutputStream.

Tal vez debería revisar un poco el diseño de la aplicación y comprobar por qué no lo está haciendo y está terminando con una instancia cerrada de OutputStream que todavía se está ejecutando en su aplicación.


El flujo subyacente puede no saber que está cerrado hasta que intente escribir en él (por ejemplo, si el otro extremo de un socket lo cierra)

El enfoque más simple es usarlo y manejar lo que sucede si se cierra entonces, en lugar de probarlo primero también.

No importa lo que haga la prueba, siempre existe la posibilidad de que reciba una excepción IOException, por lo que no puede evitar el código de manejo de excepciones. Añadir esta prueba es probable que complique el código.


No. Si implementas el tuyo, podrías escribir un método isClosed, pero si no conoces la clase concreta, entonces no. OutputStream es solo una clase abstracta. Aquí está su implementación:

/** * Closes this output stream and releases any system resources * associated with this stream. The general contract of <code>close</code> * is that it closes the output stream. A closed stream cannot perform * output operations and cannot be reopened. * <p> * The <code>close</code> method of <code>OutputStream</code> does nothing. * * @exception IOException if an I/O error occurs. */ public void close() throws IOException { }



public boolean isStreamClosed(FileOutputStream out){ try { FileChannel fc = out.getChannel(); return fc.position() >= 0L; // This may throw a ClosedChannelException. } catch (java.nio.channels.ClosedChannelException cce) { return false; } catch (IOException e) { } return true; }

Esto solo es posible para un FileOutputStream!