Como transformar uma String em um InputStreamReader em java?

281

Como posso transformar um Stringvalor em um InputStreamReader?

Yossale
fonte

Respostas:

327

ByteArrayInputStream também faz o truque:

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

Em seguida, converta para o leitor:

InputStreamReader reader = new InputStreamReader(is);
Guido
fonte
3
Você pode desejar para herdar charset padrão da plataforma.
magro
2
Obrigado. Feito. Qual é a melhor maneira de detectar o conjunto de caracteres padrão da plataforma?
Guido
5
Ou apenas use getBytes () sem um parâmetro ... Provavelmente não deveria existir, mas usará a codificação padrão.
227 Michael Borgwardt
1
ByteArrayInputStream : Desde: JDK1.0 Não há o menor motivo para supor que essa classe seja "desde o Java 1.4". Esse número de versão errado é especialmente estranho quando o Java 1.4 foi introduzido NIOe faz pouco sentido introduzir uma API e seu sucessor conceitual na mesma versão.
Holger
61

Eu também encontrei a IOUtilsclasse apache commons , então:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));
Yossale
fonte
35
Converter String-> byte [] ou vice-versa sem mencionar uma codificação de caracteres é quase sempre um bug.
Joachim Sauer
1
Isso pode causar perda de dados, dependendo da codificação da plataforma padrão e dos caracteres na sequência. Especificar uma codificação Unicode para operações de codificação e decodificação seria melhor. Leia isto para obter mais detalhes: ilegalargumentexception.blogspot.com/2009/05/…
McDowell
O parâmetro de codificação não é apenas necessário para obter bytes em uma determinada codificação? Eu acho que, desde que você escolha a mesma codificação para a chamada String # getBytes e escolha para o construtor InputSTreamReader, realmente não importa qual você escolher. Tenho certeza de que Joachim e McDowell estão errados nesse caso específico. Não é necessário conhecimento de codificação para agrupar um InputStreamReader em uma String.
Stijn de Witt
4
@ Stijn de Witt - resposta tardia, eu sei, mas acabei de ver isso. Se a codificação da plataforma padrão não suportar os pontos de código na cadeia, haverá perda de dados. Se sua codificação padrão for UTF-8, não há problema. Se você estiver executando no Windows, perderia a maior parte do conjunto Unicode porque esses JREs são padronizados para codificações "ANSI" herdadas. A prova está no link que eu postei. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")seria sem perdas.
McDowell
viva, usando uma biblioteca de terceiros para transformar uma linha em ... uma linha maior. Para não falar sobre a conversão inútil de uma Stringem uma byte[]matriz para converter os bytes de volta para chars então ...
Holger
32

Ele precisa ser especificamente um InputStreamReader? Que tal usar StringReader ?

Caso contrário, você pode usar StringBufferInputStream , mas está obsoleto devido a problemas de conversão de caracteres (e é por isso que você deve preferir StringReader).

Dan Dyer
fonte
16

Mesma pergunta que @Dan - por que não StringReader?

Se precisar ser InputStreamReader, então:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);
kit de ferramentas
fonte
Bom, mas a segunda linha deve ser #byte[] bytes = charset.getBytes();
AabinGunz
1
Acho que não, Abhishek. No meu exemplo, string é a instância de String que você deseja acessar usando um InputStreamReader.
toolkit
3

Você está tentando obter a) Readerfuncionalidade InputStreamReaderou b) InputStreamfuncionalidade InputStreamReader? Você não terá b). InputStreamReadernão é um InputStream.

O objetivo de InputStreamReaderé pegar uma InputStream- uma fonte de bytes - e decodificar os bytes para caracteres na forma de a Reader. Você já possui seus dados como caracteres (sua String original). Codificar sua String em bytes e decodificar os bytes de volta para chars seria uma operação redundante.

Se você está tentando tirar uma Readerproveito da sua fonte, use StringReader.

Se você está tentando obter um InputStream(que fornece apenas bytes), use o apache commons, IOUtils.toInputStream(..)conforme sugerido por outras respostas aqui.

Fai Ng
fonte
2

Você pode experimentar o Cactoos :

InputStream stream = new InputStreamOf(str);

Então, se você precisar de Reader:

Reader reader = new ReaderOf(stream);
yegor256
fonte