Você declarou em seu comentário sobre a resposta de Calum que iria usar
CharStreams.toString(new InputStreamReader(supplier.get(), Charsets.UTF_8))
Este código é problemático porque os CharStreams.toString(Readable)
estados de sobrecarga :
Não fecha o Readable
.
Isso significa que o seu InputStreamReader
e, por extensão, o InputStream
retornado por supplier.get()
, não serão fechados após a conclusão desse código.
Se, por outro lado, você tirar vantagem do fato de que parece já ter um InputSupplier<InputStream>
e usou a sobrecarga CharStreams.toString(InputSupplier<R extends Readable & Closeable>
), o toString
método tratará da criação e do fechamento do Reader
para você.
Isso é exatamente o que Jon Skeet sugeriu, exceto que não há realmente nenhuma sobrecarga de CharStreams.newReaderSupplier
que leva um InputStream
como entrada ... você tem que fornecer um 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);
O objetivo InputSupplier
é tornar sua vida mais fácil, permitindo que o Guava manuseie as peças que exigem um try-finally
bloco feio para garantir que os recursos sejam fechados adequadamente.
Editar: Pessoalmente, acho o seguinte (que é como eu realmente escreveria, estava apenas decompondo as etapas no código acima)
String text = CharStreams.toString(
CharStreams.newReaderSupplier(supplier, Charsets.UTF_8));
ser muito menos prolixo do que isso:
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);
}
O que é mais ou menos o que você teria que escrever para lidar com isso adequadamente.
Edição: fevereiro de 2014
InputSupplier
e OutputSupplier
os métodos que os usam foram descontinuados no Guava 16.0. Seus substitutos são ByteSource
, CharSource
, ByteSink
e CharSink
. Dado um ByteSource
, agora você pode obter seu conteúdo String
como este:
ByteSource source = ...
String text = source.asCharSource(Charsets.UTF_8).read();
Charsets.US_ASCII
), em vez de permitir que você diga "eh, qualquer conjunto de caracteres, eu acho?" o que para muitas pessoas parece feliz em fazer. Principalmente porque o Java não usa um padrão que faz sentido, como UTF-8.