2010-03-05 6 views
1

i remarqué dans un programme java la ligne ci-dessous permet d'ouvrir un fichier et le traiterEn ce qui concerne le fichier java fermeture

BufferedReader inp = new BufferedReader(new FileReader(inputFile)); 

Dans le javaprogram l'InP n'est pas fermé avant de quitter le programme de la ligne ci-dessous manque

if (inp != null) 
    try { 
     inp.close(); 
    } catch (IOException logOrIgnore) {} 

Le programme a quitté dans beaucoup de place mais ils n'avaient pas fermé le fichier. Ai-je besoin de mettre cette ligne partout? Si je ne ferme pas le fichier quand le programme se termine ce sera un problème. Le garbage collector ferme-t-il le fichier?

+0

est le BufferedReader transmis à d'autres méthodes ou utilisé dans un seul emplacement? –

+0

Que voulez-vous dire par "programme a des sorties dans beaucoup d'endroits"? Le programme se termine-t-il en utilisant System.exit()? Si oui, l'approche try/finally ne fonctionnera pas. – Rahul

+0

Sur une note connexe, je souhaite parfois que Java ait 'using' (a la C#). Il permet une élimination déterministe avec beaucoup moins de fouillis de code, et encourage la bonne chose. –

Répondre

3

Vous devez utiliser try/finally:

Reader inp = new BufferedReader(new FileReader(inputFile)); 
try { 
    // Do stuff with "inp" 
} finally { 
    IOUtils.closeQuietly(inp); 
} 

IOUtils est de Apache Commons IO. Sa méthode closeQuietly est comme votre extrait de code ci-dessus: elle appelle close et ignore les exceptions levées.

+0

Merci beaucoup pour l'info. – Arav

0

Le garbage collector ne ferme pas le fichier. Si vous savez que votre programme ne fonctionnera pas longtemps ou ouvrir plusieurs fichiers, vous pouvez vous en sortir sans fermer le fichier. Mais sinon, vous devez le fermer manuellement.

+0

function() { BufferedReader inp = nouveau BufferedReader (nouveau FileReader (inputFile)); } Puisqu'il est défini à l'intérieur d'une fonction d'objet, ne sera-t-il pas détruit automatiquement après la sortie de la fonction? Est-ce que cela en fera un problème si je ne le ferme pas? – Arav

+2

Le garbage collector * fait * fermer le fichier, mais il n'y a aucune garantie qu'il s'exécutera jamais. Le système d'exploitation ferme également le fichier lorsque le processus se termine. Pour les fichiers d'entrée c'est assez bon. Pour les fichiers de sortie avec des tampons dans l'espace application tels que BufferedOutputStream, BufferedWriter, ObjectOutputStream, PrintStream, PrintWriter, ce n'est pas le cas. – EJP

+0

@EJP: Il n'y a rien dans le javadoc pour FileReader ou BufferedReader qui dit qu'il sera fermé automatiquement. Ils ont tous deux une méthode close() explicite. Ils héritent tous deux de finalize() d'Object, donc je ne vois pas comment quelque chose de spécifique au lecteur pourrait se produire quand l'objet est GC'd. (Vous êtes bien sûr correct que le système d'exploitation ferme le fichier quand le processus se termine.) –

0

Il semble que vous utilisiez BufferedReader sans revenir au contexte dans lequel il a été déclaré (éventuellement une variable d'instance?). Dans ce cas, vous devez le fermer manuellement à chaque sortie possible de votre application. Vous ne pouvez pas compter sur le garbage collector pour le faire pour vous.

+0

function() {BufferedReader inp = new BufferedReader (nouveau FileReader (inputFile)); } Comme il est défini à l'intérieur d'une fonction d'objet, ne sera-t-il pas automatiquement détruit après la sortie de la fonction? Est-ce que cela en fera un problème si je ne le ferme pas? – Arav

+0

@arav: Il sera récupéré par la poubelle (probablement bientôt, mais sans garantie de promptitude), mais cela ne se produira pas immédiatement à la sortie de la fonction. L'approche try/finally permet à la fermeture du fichier de se produire exactement au moment où vous l'attendez ("élimination déterministe"). –

+0

@arav: Quant à savoir si c'est un problème si vous ne le fermez pas explicitement, si vous appelez cette fonction trop de fois avant que le garbage collector puisse finaliser vos lecteurs, vous manquerez de descripteurs de fichiers disponibles, et plus réussira (jusqu'à ce que certains descripteurs de fichiers existants soient fermés). –