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 InputStream
devuelto 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 toString
método manejará tanto la creación como el cierre del mismo Reader
por usted.
Esto es exactamente lo que sugirió Jon Skeet, excepto que en realidad no hay ninguna sobrecarga CharStreams.newReaderSupplier
que tome InputStream
como 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 InputSupplier
es hacer su vida más fácil permitiendo que Guava maneje las partes que requieren un try-finally
bloque 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
InputSupplier
y OutputSupplier
los métodos que los utilizan han quedado obsoletos en Guava 16.0. Sus sustitutos son ByteSource
, CharSource
, ByteSink
y CharSink
. Dado un ByteSource
, ahora puede obtener su contenido String
así:
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.