4 votes

Puis-je utiliser try-with-resources avec un InputStream qui a déjà été créé ?

Comme ça :

public void myMethod(InputStream fileIn){
    try (InputStream in = fileIn)  {
        do stuff....
    }
}

Cela semble fonctionner. Est-ce sûr ?

12voto

Andy Turner Points 13883

Cela semble fonctionner

Cela fera l'affaire si vous ajoutez InputStream (ou un super-type de InputStream ) avant in : le La spécification du langage exige vous devez soit déclarer une variable pour chaque ressource.

try (InputStream in = fileIn) { ... }

ou simplement se référer directement à fileIn en Java 9+ :

try (fileIn) { ... }

Et il n'y a aucune raison pour que cela ne fonctionne pas : avec la forme de déclaration de variable, vous assignez une expression à la variable (une nouvelle classe, le résultat de l'invocation d'une méthode, un élément de tableau etc). La ressource ne peut pas voir si elle obtient une "nouvelle" instance ou non : c'est juste une chose avec une valeur du bon type.

est-il sûr ?

Cela dépend de ce que vous entendez exactement par "sûr".

Il est certainement sûr dans le sens où il fonctionnera sans erreur dans ce code, et in.close() sera invoqué à la fin du bloc.

Toutefois, cela enfreint la règle empirique selon laquelle "si vous n'avez pas ouvert un flux, ne le fermez pas". En tant que telle, elle peut être dangereuse dans le sens où elle provoque des échecs inattendus dans d'autres parties du programme qui s'attendent à ce que le flux soit toujours ouvert après avoir invoqué la méthode.

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