2011-09-08 9 views
14

Molte risorse di I/O in Java come InputStream e OutputStream devono essere chiuse al termine, come illustrato in here.Come trovare le risorse I/O non chiuse in Java?

Come posso cercare nel mio progetto i luoghi in cui tali risorse non vengono chiuse, ad es. questo tipo di errore:

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 
} 

Ho provato alcuni strumenti di analisi statica, come PMD e FindBugs, ma non lo fanno bandiera il codice di cui sopra come essere sbagliato.

+3

FindBugs sembra essere in grado di rilevare questo, però: http://stackoverflow.com/questions/2570820/findbugs-may-fail-to-close-stream-is-this-valid-in-case-of- inputstream – Thilo

+1

Sembra che sia necessario regolare quali regole FindBugs controlla –

risposta

1

In Java 7, hanno aggiunto una caratteristica di utilizzare le risorse chiudibili portata attuale (così chiamato risorse try-con-), come ad esempio:

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

Nelle versioni più vecchie, la tecnica comune sta usando try- catena catch-finally.

+1

OK, quindi la mia domanda in altre parole è in Java 6 o precedente, come posso trovare le istanze di non utilizzare la tecnica "prova poi finalmente chiudi"? –

+0

Google dice che FindBugs è in grado di trovare questo tipo di bug –

5

Probabilmente è questione di impostazione - Ho eseguito FindBugs tramite il mio plug-in IDE e ha segnalato OS_OPEN_STREAM.

+0

Puoi elaborare quali impostazioni devono essere eseguite in FindBugs? IMO, questo dovrebbe essere abilitato per impostazione predefinita, dati gli effetti collaterali del crash dell'applicazione quando si è esaurito ulimit. – bram

6

Se FindBugs con regole modificate non funziona per voi, un altro approccio più lento è l'analisi dell'heap. VisualVM consente di eseguire query su tutti gli oggetti di un tipo specifico aperti in qualsiasi momento all'interno di un dump dell'heap mediante OQL. È quindi possibile controllare gli stream aperti ai file che non dovrebbero essere accessibili in quel punto del programma.

in corso è il più semplice:

%>jvisualvm 

Scegliere il processo in esecuzione. Scegli l'opzione salva heap dump (o qualcosa del genere), apri il dump dell'heap e guarda le istanze di classe per i flussi di file nel browser, oppure esegui una query per loro.

Problemi correlati