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 InputStreamReadere, por extensão, o InputStreamretornado 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 toStringmétodo tratará da criação e do fechamento do Readerpara você.
Isso é exatamente o que Jon Skeet sugeriu, exceto que não há realmente nenhuma sobrecarga de CharStreams.newReaderSupplierque leva um InputStreamcomo 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-finallybloco 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
InputSuppliere OutputSupplieros métodos que os usam foram descontinuados no Guava 16.0. Seus substitutos são ByteSource, CharSource, ByteSinke CharSink. Dado um ByteSource, agora você pode obter seu conteúdo Stringcomo 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.