Как я могу превратить строку в InputStreamReader в Java?

Ответы:

327

ByteArrayInputStream также добивается цели :

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

Затем преобразуйте в читателя:

InputStreamReader reader = new InputStreamReader(is);
Guido
источник
3
Возможно, вы захотите наследовать кодировку платформы по умолчанию.
тонкий
2
Спасибо. Готово. Каков наилучший способ определения кодировки по умолчанию для платформы?
Гвидо
5
Или просто используйте getBytes () без параметра ... Возможно, он не должен существовать, но будет использовать кодировку по умолчанию.
Майкл Боргвардт
1
ByteArrayInputStream : Since: JDK1.0 Нет ни малейшей причины предполагать, что этот класс «начиная с Java 1.4». Этот неправильный номер версии особенно странен, когда появилась Java 1.4, NIOи нет смысла вводить API и его концептуальный преемник в одной и той же версии.
Хольгер
61

Я также нашел IOUtilsкласс Apache Commons , так что:

InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));
Yossale
источник
35
Преобразование String-> byte [] или наоборот без упоминания кодировки символов почти всегда является ошибкой.
Иоахим Зауэр
1
Это может привести к потере данных в зависимости от кодировки платформы по умолчанию и символов в строке. Было бы лучше указать кодировку Unicode для операций кодирования и декодирования. Прочитайте это для получения более подробной информации: нелегально
McDowell
Разве параметр param не нужен, чтобы получить байты в определенной кодировке? Я думаю, что до тех пор, пока вы выбираете ту же кодировку для вызова String # getBytes, что и для конструктора InputSTreamReader, на самом деле не имеет значения, какую вы выберете. Я почти уверен, что Иоахим и Макдауэлл не правы в этом конкретном случае. Не требуется знания кодирования для наложения InputStreamReader вокруг String.
Стейн де Витт
4
@Stijn de Witt - запоздалый ответ, я знаю, но я только что видел это. Если кодировка платформы по умолчанию не поддерживает кодовые точки в строке, это приведет к потере данных. Если кодировкой по умолчанию является UTF-8, нет проблем. Если вы работаете в Windows, вы потеряете большую часть набора Unicode, потому что эти JRE по умолчанию используют устаревшие кодировки "ANSI". Доказательство находится в ссылке, которую я разместил. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")будет без потерь.
Макдауэлл
ура, используя стороннюю библиотеку, чтобы превратить одну строку в… большую строку. Чтобы не говорить о бесполезном преобразовании a Stringв byte[]массив, чтобы преобразовать байты обратно в chars тогда…
Хольгер
32

Это должен быть конкретно InputStreamReader? Как насчет использования StringReader ?

В противном случае вы могли бы использовать StringBufferInputStream , но он устарел из-за проблем с преобразованием символов (вот почему вы должны предпочесть StringReader).

Дэн Дайер
источник
16

Тот же вопрос, что и у @Dan - почему не StringReader?

Если это должен быть InputStreamReader, то:

String charset = ...; // your charset
byte[] bytes = string.getBytes(charset);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
InputStreamReader isr = new InputStreamReader(bais);
Инструментарий
источник
byte[] bytes = charset.getBytes();
Хорошо
1
Я так не думаю, Абхишек. В моем примере строка является экземпляром String, к которому вы хотите получить доступ, используя InputStreamReader.
Инструментарий
3

Вы пытаетесь получить а) Readerфункциональность InputStreamReaderили б) InputStreamфункциональность InputStreamReader? Вы не получите б). InputStreamReaderне является InputStream.

Цель InputStreamReaderсостоит в том, чтобы взять InputStream- источник байтов - и декодировать байты в символы в форме a Reader. У вас уже есть данные в виде символов (исходная строка). Кодирование вашей String в байты и декодирование байтов обратно в символы будет избыточной операцией.

Если вы пытаетесь получить Readerиз своего источника, используйте StringReader.

Если вы пытаетесь получить InputStream(который дает вам только байты), используйте Apache Commons, IOUtils.toInputStream(..)как предложено другими ответами здесь.

Фай Нг
источник
2

Вы можете попробовать Cactoos :

InputStream stream = new InputStreamOf(str);

Тогда, если вам нужно Reader:

Reader reader = new ReaderOf(stream);
yegor256
источник