studio programacion otro móviles desarrollo curso cuando cierro cierra cerrar aplicaciones abrir java stream inputstream outputstream

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



curso android desarrollo de aplicaciones móviles pdf (6)

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

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 secuencia, salgo de myMethod() pero el programa, que a su vez es el proceso, no finaliza y continúa con otras operaciones.

No cerré las transmisiones. ¿Se cerrará automáticamente una vez que finalice el alcance de la referencia a la clase A? (es decir, cuando myMethod() finaliza)? ¿GC se ocupa de eso? Además, leí que las transmisiones se cerrarán una vez que el proceso finalice y el sistema liberará todos los recursos que tiene para otros procesos. ¿Cómo podemos verificar si la transmisión está abierta o no? ¿Hay algún comando u opción de Linux para verificarlo?

¡Cualquier ayuda es apreciada!


Con Java 7, puede crear uno o más "recursos" en la declaración try. Un "recurso" es algo que implementa la interfaz java.lang.AutoCloseable. Este recurso se cerrará automáticamente y al final del bloque try.

puedes mirar esto y java doc para más información

private static void printFileJava7 () arroja 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 try 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 se pueden usar dentro de la construcción try-with-resources.


En el caso de FileInputStream hay un método finalize() que liberará recursos cuando la transmisión sea basura.

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


Esa es una mala práctica de programación, un error del programador. Dependiendo de la fuente de datos subyacente, es posible que nunca se cierre y que tenga fugas. DEBE cerrar cualquier recurso cuando haya terminado con él, en un bloque finally o utilizando un intento con recursos si es Java 7 o superior, para asegurarse de que esté cerrado incluso si se lanza 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(); } }


No creo que la especificación de JVM ofrezca ninguna garantía al respecto. Se supone que finally debes cerrar estos recursos.

Cuando el proceso finaliza, el sistema operativo liberará todos los recursos asociados (incluida la memoria, los identificadores de archivos y los sockets de red).

Hay instalaciones de SO para verificar si hay archivos y flujos abiertos, como lsof .


No hay garantía de que los recursos se cierren siempre que se ejecute la JVM. Su implementación sugerida es bastante peligrosa.

Lo que yo sugeriría Haga que la clase A sea A Cerrar y use el tryResourceClose-Statement de Java. El ejemplo está aquí. https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Después de dejar el try-block, tienes la oportunidad de cerrar tus recursos.

La secuencia en sí misma normalmente no sabe si está abierta o no. Sin embargo, su propia clase A puede hacer un seguimiento si las transmisiones se cerraron o no.


Si no está cerrando manualmente, todos los recursos no administrados se liberarán cuando el proceso termiantes, sin embargo, no es una recomendación ni una práctica recomendada. Siempre debe cerrar su secuencia una vez que haya terminado con ella.

Una forma mejor y sugerida de administrar la transmisión es usar la opción try with resource como esta:

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

No cerré las transmisiones. ¿Se cerrará automáticamente una vez que finalice el alcance de la referencia a la clase A?

No, no se cerrará automáticamente.

Una buena referencia para seguir es:

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