Vous avez dit dans votre commentaire sur Calum la réponse que vous allez utiliser
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
Ce code est problématique en raison de la surcharge CharStreams.toString(Readable)
membres de:
Ne fermez pas l' Readable
.
Cela signifie que votre InputStreamReader
, et, par extension, InputStream
retournée par supplier.get()
, ne sera pas fermé après cette fin du code.
Si, d'autre part, vous profitez du fait que vous semblez déjà avoir un InputSupplier<InputStream>
et utilisé la surcharge CharStreams.toString(InputSupplier<R extends Readable & Closeable>
), l' toString
méthode permettra de gérer à la fois la création et la fermeture de l' Reader
pour vous.
C'est exactement ce que Jon Skeet suggéré, sauf qu'il n'y a pas réellement une surcharge de CharStreams.newReaderSupplier
qui prend un InputStream
comme entrée... vous devez 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 point de InputSupplier
est de rendre votre vie plus facile en permettant de Goyave pour gérer les pièces qui nécessitent un vilain try-finally
block pour s'assurer que les ressources sont correctement fermé.
Edit: Personnellement, je trouve le suivant (qui est de savoir comment j'avais fait de l'écrire, c'était juste en décomposant les étapes décrites dans le code ci-dessus)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
à être beaucoup moins verbeux que ceci:
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);
}
Ce qui est plus ou moins ce que vous devriez écrire pour gérer cela correctement vous-même.
Edit: Févr. 2014
InputSupplier
et OutputSupplier
et les méthodes qui les utilisent ont été désapprouvées dans la Goyave 16.0. Leurs remplaçants sont ByteSource
, CharSource
, ByteSink
et CharSink
. Étant donné un ByteSource
, vous pouvez maintenant obtenir son contenu en tant que String
comme ceci:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();