Apache Commons IO tiene un método de conveniencia agradable IOUtils.toString () para leer InputStreamuna 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.iopaquete 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 elInputStreamdevuelto 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>), eltoStringmétodo manejará tanto la creación como el cierre del mismoReaderpor usted.Esto es exactamente lo que sugirió Jon Skeet, excepto que en realidad no hay ninguna sobrecarga
CharStreams.newReaderSupplierque tomeInputStreamcomo entrada ... tienes que darle unInputSupplier:El objetivo
InputSupplieres hacer su vida más fácil permitiendo que Guava maneje las partes que requieren untry-finallybloque 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
InputSupplieryOutputSupplierlos métodos que los utilizan han quedado obsoletos en Guava 16.0. Sus sustitutos sonByteSource,CharSource,ByteSinkyCharSink. Dado unByteSource, ahora puede obtener su contenidoStringasí:fuente
InputStream, y quieres obtenerlo como talString,CharStreams.toString(new InputStreamReader(inputStream, charset))es el camino a seguir.ByteSourceyCharSourceson específicamente para casos en los que tiene algo que puede actuar como fuente deInputStreams oReaders.Si tienes un
Readablepuedes 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,toStringlo hará no cerca queReader(y por lo tanto no la corriente subyacente!). Al usar unInputSupplierpara elReader, eltoStringmétodo manejará el cierre delReaderpara 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