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 InputStreamrenvoyé 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 toStringmé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.newReaderSupplierqui prend une InputStreamentré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 InputSupplierest de vous faciliter la vie en permettant à Guava de gérer les pièces qui nécessitent un try-finallybloc 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
InputSupplieret OutputSupplierles méthodes qui les utilisent sont devenues obsolètes dans Guava 16.0. Leurs remplaçants sont ByteSource, CharSource, ByteSinket CharSink. Étant donné a ByteSource, vous pouvez maintenant obtenir son contenu Stringcomme 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.