Fermer un Scanner relié au système.en
j'ai un Scanner
lié System.in
. Maintenant, après avoir utilisé le Scanner
, je devrais la fermer, que c'est une mauvaise pratique de codage, de la laisser ouverte. Mais, si je ferme l' Scanner
, je vais aussi être de fermeture System.in
! Quelqu'un peut-il me dire comment je peux fermer le Scanner
sans fermeture System.in
(s'il y a un moyen).
5 réponses
une option est d'envelopper votre System.in
stream CloseShieldInputStream
qui l'empêche d'être fermé. Votre lecteur utiliserait alors le CloseShieldInputStream
plutôt que le raw System.in
stream.
Voici L'API pour la classe: http://commons.apache.org/io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html
la chose la plus simple est de ne pas fermer le Scanner si vous ne voulez pas fermer le flux sous-jacent.
Idéalement, vous devriez créer juste un Scanner que vous utilisez pour la vie du programme. En tout cas, il semble que vous n'avez pas une bonne raison de le fermer.
au lieu d'ajouter des classes de bouclier et des trucs comme ça, il suffit de mettre un joli commentaire et un
@SuppressWarnings("resource")
C'est suffisant. Et je ne vois pas beaucoup d'inconvénients à cette approche. N'oubliez pas le commentaire.
j'ai de vagues souvenirs de problèmes étranges, impossibles à diagnostiquer il y a longtemps avec l'utilisation de la même Scanner
System.in
deux fois, donc c'est ce que j'utilise (même si vous devriez probablement utiliser un scanner pour la durée du programme):
static String input() {
try {
return new Scanner(System.in).nextLine();
} catch (NoSuchElementException e) {
throw e;
}
}
Pour une raison quelconque, cela fonctionne sans avertissements, alors que si je ne fais pas l'attraper-lancer, Eclipse va se plaindre Resource leak: '<unassigned Closeable value>' is never closed
.