2011-09-08 7 views
14

Muchos recursos de E/S en Java, como InputStream y OutputStream, deben cerrarse cuando finalizan, como se explica en here.¿Cómo encontrar recursos de E/S no cerrados en Java?

¿Cómo puedo buscar en mi proyecto los lugares donde tales recursos no se están cerrando, p. este tipo de error:

private void readFile(File file) throws IOException { 
    InputStream in = new FileInputStream(file); 
    int nextByte = in.read(); 
    while (nextByte != -1) { 
     // Do something with the byte here 
     // ... 
     // Read the next byte 
     nextByte = in.read(); 
    } 
    // Oops! Not closing the InputStream 
} 

he intentado algunas herramientas de análisis estático como PMD y FindBugs, pero no lo hacen bandera del código anteriormente como equivocada.

+3

FindBugs parece ser capaz de detectar esto, aunque: http://stackoverflow.com/questions/2570820/findbugs-may-fail-to-close-stream-is-this-valid-in-case-of- inputstream – Thilo

+1

Parece que necesita ajustar qué reglas FindBugs comprueba –

Respuesta

1

En Java 7, se añadió una característica de la utilización de los recursos que pueden cerrarse en su alcance de corriente (llamado así try-con-recursos), tales como:

public void someMethod() { 
    try(InputStream is = new FileInputStream(file)) { 
     //do something here 
    } // the stream is closed here 
} 

En las versiones anteriores, la técnica común es usar prueba- atrapar-finalmente la cadena.

+1

OK, por lo que mi pregunta en otras palabras es en Java 6 o anterior, ¿cómo puedo encontrar instancias de no utilizar la técnica "try then finally close"? –

+0

Google dice que FindBugs puede encontrar este tipo de errores –

5

Probablemente es asunto de configuración - Ejecuté FindBugs a través de mi complemento IDE e informó OS_OPEN_STREAM.

+0

¿Puede explicar qué configuración debe hacerse en los FindBugs? IMO, esto debería haberse habilitado de manera predeterminada, dados los efectos secundarios del bloqueo de la aplicación cuando se agotó el límite de ulimit. – bram

6

Si FindBugs con reglas modificadas no funciona para usted, otro enfoque más lento es el análisis de pila. VisualVM le permite consultar todos los objetos de un tipo específico que están abiertos en un momento dado dentro de un volcado de pila con OQL. A continuación, puede verificar si hay secuencias abiertas a archivos a los que no se debe acceder en ese punto del programa.

en marcha Es tan simple como:

%>jvisualvm 

Seleccione el proceso en ejecución. Elija la opción para guardar el volcado del montón (o algo por el estilo), abra el volcado del montón y observe las instancias de clase para las secuencias de archivos en el buscador o haga una consulta para encontrarlas.

Cuestiones relacionadas