



Должен ли это быть конкретно InputStreamReader? Как насчет использования StringReader?
В противном случае вы можете использовать StringBufferInputStream, но он устарел из-за проблем с преобразованием символов (поэтому вам следует предпочесть StringReader).
ByteArrayInputStream также делает свое дело:
InputStream is = new ByteArrayInputStream( myString.getBytes( charset ) );
Затем конвертируйте в читателя:
InputStreamReader reader = new InputStreamReader(is);
Спасибо. Сделанный. Как лучше всего определить кодировку платформы по умолчанию?
Или просто используйте getBytes () без параметра ... Возможно, он не должен существовать, но он будет использовать кодировку по умолчанию.
Тот же вопрос, что и @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();
Я так не думаю, Абхишек. В моем примере строка - это экземпляр String, к которому вы хотите получить доступ с помощью InputStreamReader.
Я также нашел класс apache commons IOUtils, поэтому:
InputStreamReader isr = new InputStreamReader(IOUtils.toInputStream(myString));
Преобразование String-> byte [] или наоборот без упоминания кодировки символов почти всегда является ошибкой.
Это может привести к потере данных в зависимости от кодировки платформы по умолчанию и символов в строке. Было бы лучше указать кодировку Unicode для операций кодирования и декодирования. Прочтите это для более подробной информации: незаконныйargumentexception.blogspot.com/2009/05/…
Разве параметр кодировки не нужен только для получения байтов в определенной кодировке? Я думаю, пока вы выбираете ту же кодировку для вызова String # getBytes, что и для конструктора InputSTreamReader, на самом деле не имеет значения, какую из них вы выберете. Я почти уверен, что Иоахим и Макдауэлл неправы в данном конкретном случае. Для обертывания InputStreamReader вокруг String не требуются знания кодирования.
@Stijn de Witt - запоздалый ответ, я знаю, но я только что видел это. Если кодировка платформы по умолчанию не поддерживает кодовые точки в строке, это приведет к потере данных. Если ваша кодировка по умолчанию - UTF-8, нет проблем. Если вы работаете в Windows, вы потеряете большую часть набора Unicode, потому что эти JRE по умолчанию используют устаревшие кодировки «ANSI». Доказательство находится в опубликованной мной ссылке. new InputStreamReader(IOUtils.toInputStream(myString, "UTF-16"), "UTF-16") будет без потерь.
ура, используя стороннюю библиотеку, чтобы превратить однострочник в ... более крупный однострочник. Не говоря уже о бесполезном преобразовании String в массив byte[] для преобразования байтов обратно в char…
Собственно, посмотрите на реализацию: IOUtils.toInputStream(myString, StandardCharsets.UTF_8) также просто создает ByteArrayInputStream: new ByteArrayInputStream(input.getBytes(Charsets.toCharset(encoding))).
Вы пытаетесь получить а) функциональность Reader из InputStreamReader или б) функциональность InputStream из InputStreamReader? Вы не получите б). InputStreamReader не является InputStream.
Цель InputStreamReader - взять InputStream - источник байтов - и декодировать байты в символы в форме Reader. У вас уже есть данные в виде символов (исходная строка). Кодирование вашей строки в байты и декодирование байтов обратно в символы было бы избыточной операцией.
Если вы пытаетесь получить Reader из вашего источника, используйте StringReader.
Если вы пытаетесь получить InputStream (который дает вам только байты), используйте apache commons IOUtils.toInputStream(..), как предлагают другие ответы здесь.
Вы можете попробовать Какту:
InputStream stream = new InputStreamOf(str);
Затем, если вам нужен Reader:
Reader reader = new ReaderOf(stream);
Вы можете хочу унаследовать кодировку платформы по умолчанию.