Dijiste en tu comentario sobre la respuesta de Calum que ibas a usar
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
Este código es problemático porque los CharStreams.toString(Readable)estados de sobrecarga :
No cierra el Readable.
Esto significa que su InputStreamReader, y por extensión el InputStreamdevuelto por supplier.get(), no se cerrará después de que se complete este código.
Si, por otro lado, aprovecha el hecho de que parece que ya tiene un InputSupplier<InputStream>y usó la sobrecarga CharStreams.toString(InputSupplier<R extends Readable & Closeable>), el toStringmétodo manejará tanto la creación como el cierre del mismo Readerpor usted.
Esto es exactamente lo que sugirió Jon Skeet, excepto que en realidad no hay ninguna sobrecarga CharStreams.newReaderSupplierque tome InputStreamcomo entrada ... tienes que darle 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);
El objetivo InputSupplieres hacer su vida más fácil permitiendo que Guava maneje las partes que requieren un try-finallybloque feo para asegurarse de que los recursos se cierren correctamente.
Editar: Personalmente, encuentro lo siguiente (que es como lo escribiría realmente, simplemente estaba desglosando los pasos en el código anterior)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
ser mucho menos detallado que esto:
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);
}
Que es más o menos lo que tendría que escribir para manejar esto correctamente usted mismo.
Edición: febrero de 2014
InputSuppliery OutputSupplierlos métodos que los utilizan han quedado obsoletos en Guava 16.0. Sus sustitutos son ByteSource, CharSource, ByteSinky CharSink. Dado un ByteSource, ahora puede obtener su contenido Stringasí:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII) en lugar de permitirle decir "eh, ¿cuál es el juego de caracteres, supongo?" que para mucha gente parece feliz de hacer. Especialmente porque Java no usa un valor predeterminado que tenga sentido, como UTF-8.