¿Cuándo se cierra una secuencia si no se cierra manualmente?

Me gustaría saber cuándo se cierra una secuencia si no se cierra manualmente. Con esto quiero decir, ¿se cerrará la secuencia si el scope de su referencia ya no existe?

Considere el siguiente escenario de muestra.

Class A{ InputStream in; OutputStream out; A(){ // Initialize and create the streams. } ... } Class B{ public void myMethod(){ A a = new A(); System.out.println("End of my method.") } ... } 

Aquí, una vez que myMethod() con la transmisión, salgo de myMethod() pero el progtwig que, a su vez, finaliza el proceso y continúa con otras operaciones.

No cerré los arroyos. ¿Se cerrará automáticamente una vez que finalice el scope de la referencia a la clase A? (es decir, cuando termina myMethod() )? ¿GC se encarga de eso? Además, leí que las secuencias se cerrarán una vez que finalice el proceso y el sistema libere todos los recursos disponibles para otros procesos. ¿Cómo podemos verificar si la transmisión está abierta o no? ¿Hay algún comando u opción de linux de Java para verificar eso?

Cualquier ayuda es apreciada!

No creo que la especificación de JVM haga ninguna garantía al respecto. Realmente se supone que finally cerrar estos recursos.

Cuando finalice el proceso, el sistema operativo liberará todos los recursos asociados (incluidos la memoria, los manejadores de archivos y los sockets de red).

Hay instalaciones del sistema operativo para verificar los archivos abiertos y las secuencias, como lsof .

Si no lo está cerrando manualmente, todos los recursos no administrados se liberarán cuando el proceso termine, sin embargo, no se recomienda ni se recomienda. Siempre debe cerrar su flujo una vez que haya terminado con él.

Una forma mejor y sugerida de administrar la transmisión es usar la opción de probar con recursos como esta:

 try (InputStream input = new FileInputStream(...); Reader reader = new InputStreamReader(input, ...)) { ... } 

No cerré los arroyos. ¿Se cerrará automáticamente una vez que finalice el scope de la referencia a la clase A?

No, no se cerrará automáticamente.

Una buena referencia a seguir es:

Mejor gestión de recursos con Java SE 7: más allá del azúcar sintáctica

En el caso de FileInputStream hay un método finalize() que liberará recursos cuando la secuencia se recolecta como basura.

No es que puedas o debas confiar en eso. Es justo lo que hace FileInputStream . SocketInputStream por otro lado, reemplaza a finalize() para no hacer nada explícitamente, confiando en Socket para cerrar los recursos (y Socket no tiene un método finalize() ).

No hay ninguna garantía de que los recursos estarán cerrados mientras la JVM se esté ejecutando. Su implementación sugerida es bastante peligrosa.

Lo que yo sugeriría. Convierta la clase A en un Closeable y use la statement tryResourceClose de Java. El ejemplo está aquí. https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Después de dejar el bloque de prueba, tendrá la oportunidad de cerrar sus recursos.

El flujo en sí normalmente no sabe si está abierto o no. Sin embargo, su propia clase A puede realizar un seguimiento si las transmisiones se cerraron o no.

Esa es una mala práctica de progtwigción, un error del progtwigdor. Dependiendo de la fuente de datos subyacente, es posible que nunca se cierre y puede tener fugas. DEBE cerrar cualquier recurso cuando haya terminado con él, en un bloque final o usar un try con recursos si tiene Java 7 o superior, para asegurarse de que está cerrado incluso si se produce una excepción.

 InputStream in; OutputStream out; try { // Do your stuff with the streams } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } 

Con Java 7, puede crear uno o más “recursos” en la statement de prueba. Un “recurso” es algo que implementa la interfaz java.lang.AutoCloseable. Este recurso se cerraría automáticamente y el final del bloque try.

Puedes mirar esto y Java Document para más información.

 private static void printFileJava7() throws IOException { try(FileInputStream input = new FileInputStream("file.txt")) { int data = input.read(); while(data != -1){ System.out.print((char) data); data = input.read(); } } } 

Cuando el bloque de prueba finalice, FileInputStream se cerrará automáticamente. Esto es posible porque FileInputStream implementa la interfaz Java java.lang.AutoCloseable. Todas las clases que implementan esta interfaz pueden usarse dentro de la construcción try-with-resources.