O Apache Commons IO tem um método de conveniência IOUtils.toString () para ler um InputStream
para uma String.
Já que estou tentando me afastar do Apache Commons e ir para o Guava : existe um equivalente no Guava? Eu olhei para todas as classes do com.google.common.io
pacote e não consegui encontrar nada tão simples.
Edit: Eu entendo e aprecio os problemas com conjuntos de caracteres. Acontece que eu sei que todas as minhas fontes estão em ASCII (sim, ASCII, não ANSI etc.), então, neste caso, a codificação não é um problema para mim.
java
io
inputstream
guava
Sean Patrick Floyd
fonte
fonte
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.Respostas:
Você declarou em seu comentário sobre a resposta de Calum que iria usar
Este código é problemático porque os
CharStreams.toString(Readable)
estados de sobrecarga :Isso significa que o seu
InputStreamReader
e, por extensão, oInputStream
retornado porsupplier.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 sobrecargaCharStreams.toString(InputSupplier<R extends Readable & Closeable>
), otoString
método tratará da criação e do fechamento doReader
para você.Isso é exatamente o que Jon Skeet sugeriu, exceto que não há realmente nenhuma sobrecarga de
CharStreams.newReaderSupplier
que leva umInputStream
como entrada ... você tem que fornecer umInputSupplier
:O objetivo
InputSupplier
é tornar sua vida mais fácil, permitindo que o Guava manuseie as peças que exigem umtry-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)
ser muito menos prolixo do que isso:
O que é mais ou menos o que você teria que escrever para lidar com isso adequadamente.
Edição: fevereiro de 2014
InputSupplier
eOutputSupplier
os métodos que os usam foram descontinuados no Guava 16.0. Seus substitutos sãoByteSource
,CharSource
,ByteSink
eCharSink
. Dado umByteSource
, agora você pode obter seu conteúdoString
como este:fonte
InputStream
e deseja obtê-lo como umString
, esseCharStreams.toString(new InputStreamReader(inputStream, charset))
é o caminho a seguir.ByteSource
eCharSource
são especificamente para casos em que você tem algo que pode atuar como uma fonte deInputStream
s ouReader
s.Se você tiver um,
Readable
pode usarCharStreams.toString(Readable)
. Portanto, você provavelmente pode fazer o seguinte:Força você a especificar um conjunto de caracteres, o que eu acho que você deveria fazer de qualquer maneira.
fonte
InputSupplier<InputStream>
recomendo fortemente o uso emCharStreams.newReaderSupplier(supplier, Charsets.UTF_8)
vez denew InputStreamReader
. A razão é que, quando dada aInputStreamReader
,toString
vontade não perto queReader
(e, portanto, não o fluxo subjacente!). Ao usar umInputSupplier
for oReader
, otoString
método tratará do fechamento doReader
para você.ATUALIZAÇÃO : Olhando para trás, não gosto da minha solução anterior. Além disso, é 2013 agora e existem melhores alternativas disponíveis agora para Java7. Então aqui está o que eu uso agora:
ou se com InputSupplier
fonte
Por pouco. Você poderia usar algo assim:
Pessoalmente , não acho isso
IOUtils.toString(InputStream)
"legal" - porque sempre usa a codificação padrão da plataforma, que quase nunca é o que você deseja. Há uma sobrecarga que leva o nome da codificação, mas usar nomes não é uma boa ideia IMO. É por isso que gostoCharsets.*
.EDIT: Não que o acima precise de um
InputSupplier<InputStream>
como ostreamSupplier
. Se você já tem o stream, pode implementá-lo facilmente:fonte
Charsets.UTF_8.name()
- mais resistente a erros de digitação.Outra opção é ler bytes do Stream e criar uma String a partir deles:
Não é goiaba 'pura', mas é um pouco mais curto.
fonte
ByteStreams.toByteArray()
não fecha o fluxo, de acordo com o Javadoc.Com base na resposta aceita, aqui está um método utilitário que zomba do comportamento de
IOUtils.toString()
(e uma versão sobrecarregada com um conjunto de caracteres, também). Esta versão deve ser segura, certo?fonte
Há uma solução de fechamento automático muito mais curta no caso de o fluxo de entrada vir do recurso de caminho de classe:
Usa Guava Resources , inspirado em IOExplained .
fonte
EDIT (2015): Okio é a melhor abstração e ferramentas para I / O em Java / Android que eu conheço. Eu uso isso o tempo todo.
FWIW aqui está o que eu uso.
Se eu já tiver um fluxo em mãos, então:
Se estou criando um fluxo:
Como um exemplo concreto, posso ler um ativo de arquivo de texto Android como este:
fonte
Para um exemplo concreto, veja como posso ler um ativo de arquivo de texto do Android:
fonte