53 votes

Dois-je fermer InputStream après je ferme le Lecteur

Je me demandais, qu'est-il besoin de moi pour fermer la InputStream, après je ferme le lecteur?

    try {
        inputStream = new java.io.FileInputStream(file);
        reader = new InputStreamReader(inputStream, Charset.forName("UTF-8"));
    }
    catch (Exception exp) {
        log.error(null, exp);
    }
    finally {
        if (false == close(reader)) {
            return null;
        }
        // Do I need to close inputStream as well?
        if (false == close(inputStream)) {
            return null;
        }
    }

49voto

Jack Points 61503

Non, vous n'avez pas à.

Depuis le décorateur de l'approche utilisée pour les flux de données en Java peut construire de nouveaux flux ou lecture en les joignant à d'autres, ce seront automatiquement traitées par InputStreamReader mise en œuvre.

Si vous regardez sa source InputStreamReader.java vous voyez que:

private final StreamDecoder sd;

public InputStreamReader(InputStream in) {
  ...
  sd = StreamDecoder.forInputStreamReader(in, this, (String)null);
  ...
}

public void close() throws IOException {
  sd.close();
}

Si l'opération de fermeture de ferme en fait le InputStream sous-jacent le lecteur de flux.

EDIT: je veux être sûr qu' StreamDecoder fermer fonctionne également sur les flux d'entrée, restez à l'écoute.

Il a vérifié, en StreamDecoder.java

void implClose() throws IOException {
  if (ch != null)
    ch.close();
  else
    in.close();
}

qui est appelée lors de la sd de la fermeture est appelée.

11voto

Techniquement, la fermeture de la Reader va fermer l' InputStream. Cependant, si il y avait une panne entre l'ouverture de l' InputStream et la création de l' Reader, vous devez toujours fermer l' InputStream. Si vous fermez l' InputStream [des ressources] il ne devrait pas être une raison suffisante pour fermer l' Reader [le décorateur]. Il y a aussi populaire bugs où la fermeture d'un décorateur peut lancer une exception avant la fermeture de la décoration. Donc:

Resource resource = acquire();
try {
    Decorator decorated = decorate(resource);
    use(decorated);
} finally {
    resource.release();
}

Il y a quelques complications à surveiller. Certains décorateurs peut en fait contenir des ressources autochtones en raison de leur mise en œuvre. Sortie décorateurs ont généralement besoin d'être vidé, mais seulement dans le happy cas (tant dans l' try pas finally de l'îlot).

5voto

amorfis Points 4456

Vous n'avez pas à fermer le flux, si vous close() le lecteur.

Ferme le flux et libère toutes les ressources du système associé avec c'. Une fois que le flux a été fermé, plus de lecture(), prêt(), mark(), reset(), ou de l'ignorer() invocations va lancer une IOException. La fermeture d'un auparavant fermé flux n'a pas d'effet.

3voto

Jon Freedman Points 4411

Non, vous n'avez pas le lecteur à proximité de la sous-jacentes InputStream

0voto

helios Points 8379

Acordding à la source de renifler le reader ferme ses sous-jacent inputstream. Selon javadoc il semble que InputStreamReader "ferme le flux" lorsque le lecteur.close() est invoquée.

Je ne suis pas sûr si le Lecteur doit fermer ses sources lorsque vous ne lecteur.close(). Je pense que c'est important pour que votre code peut utiliser un lecteur de n'importe quel type de béton, il est.

De toute façon, il est logique qu'elle est appliquée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X