Ce qui arrive à un BufferedReader qui n'est pas fermé à l'intérieur d'un appelable.appel?

J'ai trois questions.

À expliquer, j'étais quelqu'un examen du code, et a remarqué BufferedReaders parfois ne sont pas en cours de fermeture. Généralement, Eclipse donne un avertissement que c'est un risque de fuite de mémoire (et j'ai corrigé). Cependant, à l'intérieur d'un Callable intérieur de la classe, il n'y a pas d'avertissement.

class outerClass {
    ...
    public void someMethod() {
        Future<Integer> future = outputThreadPool.submit(new innerClass(this.myProcess.getInputStream(), threadName));
        ...
    }

    class innerClass implements Callable<Integer> {
        private final InputStream stream;
        private final String prepend;

        innerClass(InputStream stream, String prepend) {
            this.stream = stream;
            this.prepend = prepend;
        }

        @Override
        public Integer call() {
            BufferedReader stdOut = new BufferedReader(new InputStreamReader(stream));
            String output = null;
            try {
                while ((output = stdOut.readLine()) != null) {
                    log.info("[" + prepend + "] " + output);
                }

            } catch (IOException ignore) {
            //I have no idea why we're ignoring this... :-|        
            }
            return 0;   
        }
    }
}

Les personnes qui ont écrit le code développeurs Java expérimentés, donc, ma première pensée est que c'est intentionnel... mais il pourrait être qu'ils étaient pressés quand ils ont écrit et il suffit de l'ignorer.

Mes questions sont:

  1. Pourquoi n'Éclipse pas mis en évidence de ce (qui peut être répondu par la réponse aux questions suivantes)?

  2. Quel est le pire qui pourrait arriver s'il est fermé à l'intérieur de la méthode call ()? (Je ne peux pas penser à une bonne raison... et j'ai cherché pendant un moment... mais peut-être que c'était voulu de ne pas fermer la BufferedReader)

  3. Quel est le pire qui pourrait arriver si le BufferedReader est pas fermé à l'intérieur de la classe?

pas de repérage des sons d'alerte plus comme une Éclipse de bug que la décision consciente de dire "c'est ok de le faire dans ce cas"
J'ai quelques réponses qui semblent contredire les uns les autres. D'une part, certaines personnes disent que le BufferedReader doit être fermé. D'autre part, ils disent qu'il ne devrait pas être fermée à cause de la fermeture de fermer la InputStream qu'il l'enveloppe, et l'appel de la classe pourraient en avoir besoin...
Voir cette question. Si une ressource comme une InputStream est passé dans une méthode, cela signifie que quelqu'un d'autre l'a ouvert, de sorte que quelqu'un d'autre doit la fermer. Si ils passent un flux de données de votre méthode, puis essayez de l'utiliser ailleurs par la suite, elle allait se briser, car il serait fermé (fermeture d'un BufferReader ferme ses cours d'eau), même si votre méthode peut uniquement avoir besoin de faire une chose avec le cours d'eau.
Jetez un oeil à mes modifications à ma réponse.

OriginalL'auteur GLaDOS | 2012-08-30