2010-09-08 11 views
5

InputStream implementa Closeable.¿Qué sentido podría tener el no cerrar un InputStream después de que finalizó?

Entiendo que cerrar un InputStream que no terminó aún, podría tener sentido para liberar algunos recursos subyacentes, y, dejándolo abierto, podría tener sentido dejar que otros métodos continúen leyendo de él.

Pero, ¿qué sentido podría tener que no para cerrar un InputStream después de que terminó?
Y si no tiene sentido, ¿por qué alcanzar el final de un InpuntStream no implica el cierre entonces?

La misma pregunta se aplicaría a Reader.

Respuesta

9

mark() y reset() le permiten "volver" en algunas implementaciones de la interfaz.

Esto es útil cuando se implementan analizadores sintácticos y correspondencias coincidentes como generalmente desea lookahead.

+0

Mi pregunta era sobre InputStream (y Reader), no se puede cerrar en general. No estoy al tanto de InputStreams o lectores rebobinables. –

+0

Ah, vale, se trata de marcar y restablecer, olvidé que son métodos de InputStream/Reader. –

+0

Entonces, esa ** es ** de hecho una buena razón que tiene mucho sentido. –

0

No conozco la semántica conectada con InputStream en java, pero, en general, es posible que no cierre una secuencia porque no la abrió usted mismo y simplemente trabajó en ella, y confíe en la parte llamante (otro método) para cerrar la secuencia. Si abrió la corriente usted mismo, siempre la cerrará.

+0

Bien, pero ¿hay alguna razón para que la API de Java no cierre un InputStream después de que finalizó? (Esto implica un acercamiento, lo que no sería mucho problema, por lo que entiendo) –

3

En respuesta a su comentario a org.life.java

lo sé, y la pregunta era: ¿por qué un fin de un InputStream no implica close()?

Porque, para algunas transmisiones, puede rebobinarlas y comenzar a leer de nuevo. Para otros, p. Enchufes, no es posible, pero tienen que obedecer las reglas del contrato.

También, porque así es como se debe cerrar la corriente (excepción no manipulación se muestra):

InputStream stream = openMethod(); 

try 
{ 
    consumeMethod(stream); 
} 
finally 
{ 
    stream.close(); 
} 

En otras palabras, debe liberar los recursos adquiridos independientemente de si ha consumido totalmente la corriente o no.

+0

¿Quiere decir que hay subclases de' Inputstream 'o' Reader' que se puede rebobinar? –

+1

@ java.is.for.desktop. Sí, si 'markSupported' devuelve verdadero, entonces puede' marcar' y 'restablecer' la posición de la secuencia. gpeche lo puso en su respuesta. –

0

Implícitamente cierre no sería tan bueno, porque

  • que sólo se realiza cuando la corriente ha llegado a su fin, lo que puede no ser el caso siempre (algunas excepciones se producen en el camino, o sólo le lea los primeros bytes de un archivo), de modo que debe manejar estos otros casos de todos modos. Tener un cierre implícito que casi siempre funciona hace que las personas sean aún más olvidadizas sobre sus bloques finalmente.
  • algunas secuencias se pueden rebobinar (marcar/restablecer).
3

Una razón en Windows podría ser mantener el archivo bloqueado. Los archivos abiertos no pueden renombrarse, eliminarse ni moverse.

+0

Bueno, ¡esta razón tiene sentido! Lamentablemente, eso no está documentado en Javadoc. –

+0

Este es el comportamiento dependiente de la plataforma. No querrás hacer cosas así a menos que sepas exactamente lo que estás haciendo, ya que este paradigma se verá afectado en las plataformas Unix. –

+0

No se puede/no se debe documentar en Javadoc, porque es específico de la plataforma (solo funciona de esa manera en Windows). – Thilo

1

Puede mark() y reset() un InputStream. Por lo tanto, una vez que llegue al final de los datos, puede regresar a la posición que marcó.Alguien que quiera reset() un InputStream podría no querer que se cierre al final.

0

A juzgar por la API de InputStream, no hay ningún problema para que una implementación particular lo haga, es decir, al final del flujo. Probablemente sea una muy buena idea para muchas transmisiones.

Cuestiones relacionadas