Як перетворити рядок у InputStreamReader в Java?


Відповіді:


327

ByteArrayInputStream також виконує трюк:

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

Потім перетворите на читач:

InputStreamReader reader = new InputStreamReader(is);

3
Можливо, ви хочете успадкувати набір платформи за замовчуванням.
стрункий

2
Дякую. Зроблено. Який найкращий спосіб виявити схему за замовчуванням платаформи?
Гвідо

5
Або просто використовувати getBytes () без параметра ... Напевно, він не повинен існувати, але він буде використовувати кодування за замовчуванням.
Майкл Боргвардт

1
ByteArrayInputStream : З: 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 для операцій кодування та декодування було б краще. Прочитайте це для більш детальної інформації: illegalargumentexception.blogspot.com/2009/05/…
McDowell

Чи не потрібен парам кодування просто для отримання байтів у певному кодуванні? Я думаю, що поки ви вибираєте те саме кодування для виклику String # getBytes, яке ви обираєте для конструктора InputSTreamReader, насправді не важливо, яке саме ви виберете. Я майже впевнений, що Йоахім і МакДауелл помиляються в цьому конкретному випадку. Немає знань з кодування, необхідних для обгортання InputStreamReader навколо рядка.
Штійн де Вітт

4
@Stijn de Witt - запізнілий відповідь Я знаю, але я щойно це побачив. Якщо кодування платформи за замовчуванням не підтримує кодові точки в рядку, це призведе до втрати даних. Якщо кодування за замовчуванням - UTF-8, немає проблем. Якщо ви працюєте в Windows, ви втратите більшу частину набору Unicode, оскільки ці JRE за замовчуванням застаріли кодування "ANSI". Доказ - за посиланням, яке я розмістив. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16")було б без втрат.
Макдауелл

Ура, використовуючи сторонні бібліотеки, щоб перетворити однолінійку в… більшу однолінійку. Не говорити про марну конверсію Stringатрибута в byte[]масив для перетворення байтів назад в chars тоді…
Holger

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

Приємно, але 2-й рядок має бутиbyte[] bytes = charset.getBytes();
AabinGunz

1
Я не думаю, що Абхішек. У моєму прикладі рядок - це екземпляр String, до якого ви бажаєте отримати доступ за допомогою InputStreamReader.
інструментарій

3

Ви намагаєтеся Readerвилучити а) функціональність InputStreamReaderабо б) InputStreamфункціональність InputStreamReader? Ви не отримаєте б). InputStreamReaderне єInputStream .

Мета InputStreamReader- взяти InputStream- джерело байтів - і розшифрувати байти до символів у вигляді аReader . Ви вже маєте свої дані як символи (ваш початковий рядок). Кодування вашої рядка в байти та декодування байтів назад до символів було б зайвою операцією.

Якщо ви намагаєтеся Readerвийти з джерела, використовуйтеStringReader .

Якщо ви намагаєтеся отримати InputStream(що дає лише байти), використовуйте апаш-общи, IOUtils.toInputStream(..)як пропонують інші відповіді.


2

Ви можете спробувати кактуси :

InputStream stream = new InputStreamOf(str);

Потім, якщо вам потрібно Reader:

Reader reader = new ReaderOf(stream);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.