2008-10-29 14 views

Respuesta

278

ByteArrayInputStream también hace el truco:

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

realmente debería especificar el juego de caracteres, para estar en el lado seguro. – toolkit

+2

Puede * querer * heredar el juego de caracteres predeterminado de la plataforma. – slim

+1

Gracias. Hecho. ¿Cuál es la mejor manera de detectar el juego de caracteres predeterminado de la plataforma? –

31

¿Tiene que ser específicamente un InputStreamReader? ¿Qué tal el uso de StringReader?

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

16

La misma pregunta como @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); 
+0

Agradable, pero la segunda línea debe ser 'byte [] bytes = charset.getBytes();' – abi1964

+1

No lo creo Abhishek. En mi ejemplo, string es la instancia de String a la que desea acceder utilizando un InputStreamReader. – toolkit

58

También encontré los comunes apache IOUtils clase, así:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString)); 
+31

La conversión de String-> byte [] o viceversa sin mencionar una codificación de caracteres es casi siempre un error. –

+1

Esto puede causar la pérdida de datos, dependiendo de la codificación de plataforma predeterminada y los caracteres en la cadena. Especificar una codificación Unicode para las operaciones de codificación y descodificación sería mejor. Lea esto para obtener más detalles: http://illegalargumentexception.blogspot.com/2009/05/java-rough-guide-to-character-encoding.html#javaencoding_lossyconversions – McDowell

+0

¿No es necesario el parámetro de codificación para obtener bytes en un cierto codificación? Creo que siempre que elijas la misma codificación para la llamada String # getBytes que elijas para el constructor InputSTreamReader, realmente no importa cuál elijas. Estoy bastante seguro de que Joachim y McDowell están equivocados en este caso específico. No se necesita conocimiento de codificación para envolver un InputStreamReader alrededor de una Cadena. –

2

¿Estás tratando de obtener una) Reader funcionalidad de InputStreamReader , o b) InputStream funcionalidad fuera de InputStreamReader? No obtendrás b). InputStreamReader no es un InputStream.

El propósito de InputStreamReader es tomar un InputStream - una fuente de bytes - y descodificar los bytes de caracteres en la forma de un Reader. Ya tiene sus datos como caracteres (su cadena original). La codificación de su Cadena en bytes y la decodificación de los bytes a caracteres sería una operación redundante.

Si está intentando obtener un Reader de su fuente, use StringReader.

Si está tratando de obtener un InputStream (que solo le da bytes), use apache commons IOUtils.toInputStream(..) según lo sugerido por otras respuestas aquí.

2

Usted puede intentar Cactoos:

InputStream stream = new InputStreamOf(str); 

Entonces, si usted necesita un Reader:

Reader reader = new ReaderOf(stream); 
Cuestiones relacionadas