¿Cómo convierto una cadena en un InputStreamReader en Java?

Respuestas:

327

ByteArrayInputStream también hace el truco:

InputStream is = new ByteArrayInputStream( myString.getBytes( charset ) );

Luego convertir a lector:

InputStreamReader reader = new InputStreamReader(is);
Guido
fuente
3
Es posible que desee heredar el juego de caracteres predeterminado de la plataforma.
delgado
2
Gracias. Hecho. ¿Cuál es la mejor manera de detectar el juego de caracteres predeterminado de la plataforma?
Guido
55
O simplemente use getBytes () sin un parámetro ... Podría decirse que no debería existir, pero usará la codificación predeterminada.
Michael Borgwardt
1
ByteArrayInputStream : Desde: JDK1.0 No hay la menor razón para suponer que esta clase es "desde Java 1.4". Ese número de versión incorrecto es especialmente extraño cuando se introdujo Java 1.4 NIOy tiene poco sentido introducir una API y su sucesor conceptual dentro de la misma versión.
Holger
61

También encontré la IOUtilsclase apache commons , entonces:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));
Yossale
fuente
35
Convertir String-> byte [] o viceversa sin mencionar una codificación de caracteres es casi siempre un error.
Joachim Sauer
1
Esto puede causar la pérdida de datos, dependiendo de la codificación de plataforma predeterminada y los caracteres en la cadena. Es mejor especificar una codificación Unicode para las operaciones de codificación y decodificación. Lea esto para más detalles: illegalargumentexception.blogspot.com/2009/05/…
McDowell
¿No es necesario el parámetro de codificación para obtener bytes en una codificación determinada? Creo que siempre que elija la misma codificación para la llamada String # getBytes que elija para el constructor InputSTreamReader, en realidad no importa cuál elija. Estoy bastante seguro de que Joachim y McDowell están equivocados para este caso específico. No se necesitan conocimientos de codificación para ajustar un InputStreamReader alrededor de una Cadena.
Stijn de Witt
44
@Stijn de Witt - respuesta tardía Lo sé, pero acabo de ver esto. Si la codificación de plataforma predeterminada no admite los puntos de código en la cadena, se producirá la pérdida de datos. Si su codificación predeterminada es UTF-8, no hay problema. Si está ejecutando en Windows, perdería la mayor parte del conjunto Unicode porque esos JRE predeterminan las codificaciones "ANSI" heredadas. La prueba está en el enlace que publiqué. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")Sería sin pérdidas.
McDowell
hurra, usando una biblioteca de terceros para convertir una línea en ... una línea más grande. No hablar sobre la conversión inútil de a Stringen una byte[]matriz para convertir los bytes de nuevo a chars entonces ...
Holger
32

¿Tiene que ser específicamente un InputStreamReader? ¿Qué hay de usar StringReader ?

De lo contrario, podría usar StringBufferInputStream , pero está en desuso debido a problemas de conversión de caracteres (por lo que debería preferir StringReader).

Dan Dyer
fuente
16

La misma pregunta que @Dan : ¿por qué no StringReader?

Si tiene que ser InputStreamReader, entonces:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);
kit de herramientas
fuente
Bonito, pero la segunda línea debería serbyte[] bytes = charset.getBytes();
AabinGunz
1
No lo creo, Abhishek. En mi ejemplo, string es la instancia de String a la que desea acceder utilizando un InputStreamReader.
kit de herramientas
3

¿Está tratando de obtener a) la Readerfuncionalidad de InputStreamReaderob) la InputStreamfuncionalidad de InputStreamReader? No obtendrás b). InputStreamReaderno es una InputStream.

El propósito de InputStreamReaderes tomar InputStreamuna fuente de bytes y decodificar los bytes en caracteres en forma de a Reader. Ya tiene sus datos como caracteres (su Cadena original). Codificar su cadena en bytes y decodificar los bytes nuevamente en caracteres sería una operación redundante.

Si está tratando de obtener una Readerfuente, use StringReader.

Si está tratando de obtener un InputStream(que solo le proporciona bytes), use apache commons IOUtils.toInputStream(..)como lo sugieren otras respuestas aquí.

Fai Ng
fuente
2

Puedes probar Cactoos :

InputStream stream = new InputStreamOf(str);

Entonces, si necesita un Reader:

Reader reader = new ReaderOf(stream);
yegor256
fuente