Question

Lors de la lecture d'un fichier texte, on crée généralement un FileReader Et puis niche ça dans un BufferedReader. Lequel des deux lecteurs dois-je fermer quand j'ai fini de lire? Est-ce que ça importe?

FileReader fr = null;
BufferedReader br = null;
try
{
    fr = new FileReader(fileName);
    br = new BufferedReader(fr);
    // ...
}
finally
{
    // should I close fr or br here?
}

Je suis un peu paranoïaque en ce qui concerne la sécurité des exceptions. Que se passe-t-il lorsque le BufferedReader Le constructeur lance une exception? Ferme-t-il le lecteur imbriqué? Ou est-il garanti de ne pas lancer?

Était-ce utile?

La solution

En général, close() sur l'emballage du flux le plus extérieur appellera close() sur les ruisseaux enveloppés. Cependant, si vous pensez qu'il est probable qu'un constructeur lancera une exception, utilisez libéral le Fermeable interface.

FileReader fr = new FileReader(fileName);
Closeable res = fr;
try {
    BufferedReader br = new BufferedReader(fr);
    res = br;
} finally {
    res.close();
}

Ainsi, même si le JVM manquait d'espace tas pour le tampon et lançait une erreur, vous ne fuiriez pas de poignée de fichier.

Pour Java 7 et au-dessus, utilisez des ressources TRY-WITH-RESORS:

try (FileReader fr = new FileReader(fileName);
    BufferedReader br = new BufferedReader(fr)) {
  // do work
}

Autres conseils

Clôture uniquement le BufferedReader est suffisant, car il enveloppe le FileReader. Si vous regardez le code source de BufferedReader vous verrez que le close Méthode, ferme le flux enveloppé.

Fermez le BufferedReader dans un bloc enfin.

Si vous appelez la méthode étroite du BufferedReader, le BufferedReader appellera la méthode proche du FileReader. Ainsi, les deux méthodes proches sont appelées. Plus précisément le BufferedReader ne fera rien MAIS Appeler la méthode proche du FileReader. Ainsi, cela n'a pas d'importance du tout. Bien que je pense que c'est une bonne pratique, appelez également la méthode étroite de BuffereDreder.

Rien n'est garanti de ne pas lancer. Parce que le tampon est alloué, il peut lancer une énergie émergente. Je sépare généralement mon code en 2 sections: acquérir des ressources, puis j'utilise des ressources. Chaque section a généralement des besoins de nettoyage uniques

Voici le code à illustrer:

// Acquire resources section.

final FileReader fr = new FileReader( fileName );

BufferedReader br = null;

try
{
    br = new BufferedReader(fr);
}
finally
{
    if ( br == null )
    {
        // Note that you are closing the fr here
        fr.close( );
    }
}

// Use resources section
try
{
    // ... use br
}
finally
{
    // Now that br is safely constructed, just all its close
    br.close( );
}

Et je suis d'accord avec vous, il n'y a rien de la valeur que de perdre silencieusement un gestionnaire de fichiers dans l'application de serveur longue en cours d'exécution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top