2011-02-23 28 views
20

Estoy trabajando como aprendiz en Test Automation. Estoy trabajando con la creación de código Junit con Eclipse y ejecuto usando Eclipse. En eso estoy recuperando los datos de la hoja de Excel usando la función FileInputStream.¿Debo cerrar FileInputStream?

FileInputStream fi=new FileInputStream("c:\\search.xls"); 
Workbook w=Workbook.getWorkbook(fi); 
Sheet s=w.getSheet(0); 

¿Es necesario cerrar la función Inputstream? Si es así, guíanos con algunas codificaciones.

Respuesta

22

Sí, necesita close la intensidad de entrada si desea liberar los recursos de su sistema.

FileInputStream.close() es lo que necesita.

7
FileInputStream fi=null; 
try { 
    fi=new FileInputStream("c:\\search.xls"); 
    Workbook w=Workbook.getWorkbook(fi); 
    Sheet s=w.getSheet(0); 
} finally { 
    if (fi!=null) { 
     fi.close(); 
    } 
} 
+4

Solo un pequeño comentario: también debe envolver la declaración 'close()' con un try/catch ya que 'close()' declara arrojar una IOException marcada. De hecho, no puedes usarlo así. Solo puedes probar/finalmente con excepciones de tiempo de ejecución. Pero con excepciones comprobadas como IOException y subclases de la misma, debes probar try/catch o try/catch/finally ... no compilará con try/finally. –

+2

Depende si se declara IOException para el método. Si lo atrapa, debe saber qué hacer con él. La parte importante es poner el close() en un bloque finally. De hecho, el manejo automático de esto es una de las características que estoy deseando ver en Java 7. – Axel

6

Debe cerrar() o finalizar su programa.

Sin embargo, puede que tenga problemas confusos si no cierra el archivo como

  • veces la prueba se ejecutan de forma individual o un grupo de prueba se ejecutan en el mismo proceso. (De modo que podría tener una prueba que funciona de una forma pero no de la otra)
  • no puede cambiar el nombre ni eliminar un archivo abierto.

Es una buena práctica cerrar siempre los recursos que haya terminado con ellos, sin embargo, veo las pruebas unitarias como secuencias de comandos que no siempre tienen que seguir las mejores prácticas.

-1

Basic CompSci 101 nos dicen que nos aseguremos de cerrar los recursos que abrimos, en Java o en cualquier idioma. Entonces sí, debes cerrarlos. El mal juju está destinado a suceder cuando no lo haces.

Además, debe aprender (y tener la inclinación) a utilizar Javadocs. Mire el Javadoc para FileInputStream y Closeable. Las respuestas están ahí.

+2

Es un enfoque realmente horrible seguir ciegamente las reglas establecidas sin críticas y comprender la parte * ¿por qué? *. * Cosas malas sucederán * - ¡oh común ?! La programación no es una magia vudú, sin mencionar las consecuencias (** el archivo no se puede mover, en general, se pueden introducir pérdidas de memoria, [el conjunto de identificadores de archivos podría estar agotado] (https://stackoverflow.com/questions/ 1661322/too-many-open-file-handles) **) de recursos no liberados propiamente, su respuesta es inútil y dañina. ** Downvoted. ** –

+1

Oooo, utilizo una forma de hablar y vas "ZOMG cree en el vudú" (en lugar de "hhhh, no lo deletreó y optó por un poco de vernáculo". Hay un algunas otras respuestas que no explican las consecuencias, y a menos que salga a neg-rep, simplemente está subiendo un montón de cajas de jabón en un caballo alto parcial. ¿Por qué no deletrear los problemas (y por qué la mayoría las personas en este hilo no lo hicieron)? Porque son fáciles de encontrar la literatura apropiada, disponible para cualquiera que haga un poco de investigación. Su elección si la encuentra inapropiada. –

5

Es siempre una buena idea para cerrar los recursos que utiliza, PERO:

Si utiliza recursos Un en recursos B, es sensato cerrar B en lugar de Un si tiene un método para eso.

En su caso, se utiliza en FileInputStreamWorkbook, así que es mejor para cerrar Workbook y se basan en Workbok que cerrará FileInputStream.

En este caso en particular, en realidad, Workbookwill closeFileInputStream al final del método getWorkbook() pero aún así es una buena idea para closeWorkbook para poder ser basura recogida.

3

Sí! siempre debe liberar los recursos una vez después de que haya terminado con ellos. Java tiene un poderoso mecanismo para la recolección de basura (tenga en cuenta que es diferente a la gestión de recursos/fugas). Entonces, ¿un recolector de basura no puede determinar si necesita el recurso en el futuro o no? No liberar los recursos puede causar problemas como: Denegación de servicios, bajo rendimiento.

Como ya se respondió pero otra manera es menos esfuerzo try with resources

try (FileInputStream fi = new FileInputStream("c:\\search.xls")) { 

     //do something with fi. 
     //fi.getChannel() ; 

    } catch(IOException e) { 
     // exception handling. 
    } finally { 
    // some statements for finally. 
    } 

Ahora usted no necesita fi.close método call() de forma explícita.

0

Recientemente, cuando traté de refactorizar mi código, tuve que mover la creación del libro a otro método, y FileInputStream se creó en ese método. Ese método crea un FileInputStream y devuelve un libro de trabajo. Pero FileInputStream no es visible desde el método principal; Entonces, ¿cómo cerraré mi FileInputStream al final del método principal? La respuesta es que no tiene que cerrar FileInputStream, sino que simplemente cierra el libro, que cierra internamente FileInputStream. En resumen, es incorrecto decir que debe cerrar FileInputStream sin importar qué.

Cuestiones relacionadas