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


Ответы:


327

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

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

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

InputStreamReader reader = new InputStreamReader(is);

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));

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);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.