Vous avez déclaré dans votre commentaire sur la réponse de Calum que vous alliez utiliser
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
Ce code est problématique car les CharStreams.toString(Readable)
états de surcharge :
Ne ferme pas le Readable
.
Cela signifie que votre InputStreamReader
, et par extension celui InputStream
renvoyé par supplier.get()
, ne sera pas fermé une fois ce code terminé.
Si, par contre, vous tirez parti du fait que vous semblez déjà avoir InputSupplier<InputStream>
et utilisé la surcharge CharStreams.toString(InputSupplier<R extends Readable & Closeable>
), la toString
méthode gérera à la fois la création et la fermeture de la Reader
.
C'est exactement ce que Jon Skeet a suggéré, sauf qu'il n'y a en fait aucune surcharge de ce CharStreams.newReaderSupplier
qui prend une InputStream
entrée ... vous devez lui donner un InputSupplier
:
InputSupplier<? extends InputStream> supplier = ...
InputSupplier<InputStreamReader> readerSupplier =
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8);
// InputStream and Reader are both created and closed in this single call
String text = CharStreams.toString(readerSupplier);
Le but InputSupplier
est de vous faciliter la vie en permettant à Guava de gérer les pièces qui nécessitent un try-finally
bloc laid pour s'assurer que les ressources sont correctement fermées.
Edit: Personnellement, je trouve ce qui suit (c'est ainsi que je l'écrirais, je décomposais simplement les étapes du code ci-dessus)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
pour être beaucoup moins verbeux que cela:
String text;
InputStreamReader reader = new InputStreamReader(supplier.get(),
Charsets.UTF_8);
boolean threw = true;
try {
text = CharStreams.toString(reader);
threw = false;
}
finally {
Closeables.close(reader, threw);
}
C'est plus ou moins ce que vous auriez à écrire pour gérer cela correctement vous-même.
Edit: février 2014
InputSupplier
et OutputSupplier
les méthodes qui les utilisent sont devenues obsolètes dans Guava 16.0. Leurs remplaçants sont ByteSource
, CharSource
, ByteSink
et CharSink
. Étant donné a ByteSource
, vous pouvez maintenant obtenir son contenu String
comme ceci:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII
) plutôt que de vous laisser dire "eh, quel jeu de caractères je suppose?" ce que tout le monde semble heureux de faire. D'autant plus que Java n'utilise pas de valeur par défaut logique, comme UTF-8.