Apache Commons IO tiene un método de conveniencia agradable IOUtils.toString () para leer InputStream
una cadena.
Ya que estoy tratando de alejarme de Apache Commons y pasar a Guava : ¿hay un equivalente en Guava? Miré todas las clases en el com.google.common.io
paquete y no pude encontrar nada tan simple.
Editar: Entiendo y aprecio los problemas con los juegos de caracteres. Da la casualidad de que sé que todas mis fuentes están en ASCII (sí, ASCII, no ANSI, etc.), así que en este caso, la codificación no es un problema para mí.
java
io
inputstream
guava
Sean Patrick Floyd
fuente
fuente
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.Respuestas:
Dijiste en tu comentario sobre la respuesta de Calum que ibas a usar
Este código es problemático porque los
CharStreams.toString(Readable)
estados de sobrecarga :Esto significa que su
InputStreamReader
, y por extensión elInputStream
devuelto porsupplier.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 sobrecargaCharStreams.toString(InputSupplier<R extends Readable & Closeable>
), eltoString
método manejará tanto la creación como el cierre del mismoReader
por usted.Esto es exactamente lo que sugirió Jon Skeet, excepto que en realidad no hay ninguna sobrecarga
CharStreams.newReaderSupplier
que tomeInputStream
como entrada ... tienes que darle unInputSupplier
:El objetivo
InputSupplier
es hacer su vida más fácil permitiendo que Guava maneje las partes que requieren untry-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)
ser mucho menos detallado que esto:
Que es más o menos lo que tendría que escribir para manejar esto correctamente usted mismo.
Edición: febrero de 2014
InputSupplier
yOutputSupplier
los métodos que los utilizan han quedado obsoletos en Guava 16.0. Sus sustitutos sonByteSource
,CharSource
,ByteSink
yCharSink
. Dado unByteSource
, ahora puede obtener su contenidoString
así:fuente
InputStream
, y quieres obtenerlo como talString
,CharStreams.toString(new InputStreamReader(inputStream, charset))
es el camino a seguir.ByteSource
yCharSource
son específicamente para casos en los que tiene algo que puede actuar como fuente deInputStream
s oReader
s.Si tienes un
Readable
puedes usarCharStreams.toString(Readable)
. Entonces probablemente puedas hacer lo siguiente:Te obliga a especificar un conjunto de caracteres, lo que supongo que deberías estar haciendo de todos modos.
fuente
InputSupplier<InputStream>
, le recomiendo usar enCharStreams.newReaderSupplier(supplier, Charsets.UTF_8)
lugar denew InputStreamReader
. La razón es que cuando se le da laInputStreamReader
,toString
lo hará no cerca queReader
(y por lo tanto no la corriente subyacente!). Al usar unInputSupplier
para elReader
, eltoString
método manejará el cierre delReader
para usted.ACTUALIZACIÓN : Mirando hacia atrás, no me gusta mi solución anterior. Además, estamos en 2013 ahora y hay mejores alternativas disponibles ahora para Java7. Así que esto es lo que uso ahora:
o si con InputSupplier
fuente
Casi. Podrías usar algo como esto:
Personalmente , no creo que
IOUtils.toString(InputStream)
sea "agradable", porque siempre utiliza la codificación predeterminada de la plataforma, que casi nunca es la que quieres. Hay una sobrecarga que toma el nombre de la codificación, pero el uso de nombres no es una gran idea, en mi opinión. Por eso me gustaCharsets.*
.EDITAR: No es que lo anterior necesite un
InputSupplier<InputStream>
archivostreamSupplier
. Sin embargo, si ya tiene la transmisión, puede implementarla con bastante facilidad:fuente
Charsets.UTF_8.name()
: más resistente a errores tipográficos.Otra opción es leer bytes de Stream y crear una cadena a partir de ellos:
No es guayaba 'pura', pero es un poco más corta.
fuente
ByteStreams.toByteArray()
no cierra el arroyo, según el Javadoc.Según la respuesta aceptada, aquí hay un método de utilidad que se burla del comportamiento de
IOUtils.toString()
(y también una versión sobrecargada con un juego de caracteres). Esta versión debería ser segura, ¿verdad?fuente
Hay una solución de cierre automático mucho más corta en caso de que el flujo de entrada provenga del recurso classpath:
Utiliza Guava Resources , inspirado en IOExplained .
fuente
EDITAR (2015): Okio es la mejor abstracción y herramientas para E / S en Java / Android que conozco. Lo uso todo el tiempo.
FWIW, esto es lo que uso.
Si ya tengo una transmisión en la mano, entonces:
Si estoy creando una transmisión:
Como ejemplo concreto, puedo leer un activo de archivo de texto de Android como este:
fuente
Para un ejemplo concreto, así es como puedo leer un activo de archivo de texto de Android:
fuente