Как преобразовать Reader в InputStream и Writer в OutputStream? - PullRequest
85 голосов
/ 15 сентября 2008

Есть ли простой способ избежать проблем с кодировкой текста?

Ответы [ 12 ]

93 голосов
/ 13 июля 2010

Если вы начинаете со строки, вы также можете сделать следующее:

new ByteArrayInputStream(inputString.getBytes("UTF-8"))
42 голосов
/ 15 сентября 2008

Вы не можете избежать проблем с кодировкой текста, но существуют решения:

Вам просто нужно выбрать кодировку по вашему выбору.

38 голосов
/ 17 октября 2012

Ну, Reader работает с символами, а InputStream - с байтами. Кодировка определяет, как вы хотите представлять свои символы в байтах, поэтому вы не можете игнорировать проблему. Что касается избежания проблем, мое мнение таково: выберите одну кодировку (например, «UTF-8») и придерживайтесь ее.

Относительно того, как на самом деле это сделать, как было указано, « очевидные имена для этих классов: ReaderInputStream и WriterOutputStream . « Удивительно » они не включены в библиотеку Java", хотя" противоположные "классы InputStreamReader и OutputStreamWriter включены.

Итак, многие люди придумали свои собственные реализации, включая Apache Commons IO . В зависимости от проблем с лицензированием, вы, вероятно, сможете включить библиотеку commons-io в свой проект или даже скопировать часть исходного кода (который можно загрузить здесь ).

Как видите, в документации обоих классов говорится, что "все кодировки charset, поддерживаемые JRE, обрабатываются правильно".

N.B. В комментарии к одному из других ответов здесь упоминается эта ошибка . Но это влияет на класс Apache Ant ReaderInputStream ( здесь ), не Apache Commons IO Класс ReaderInputStream.

19 голосов
/ 03 марта 2010

Также обратите внимание, что если вы начинаете со строки, вы можете пропустить создание StringReader и создать InputStream за один шаг, используя org.apache.commons.io.IOUtils из Commons IO like так:

InputStream myInputStream = IOUtils.toInputStream(reportContents, "UTF-8");

Конечно, вам все еще нужно подумать о кодировке текста, но по крайней мере преобразование происходит за один шаг.

8 голосов
/ 19 декабря 2014

Использование:

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

Этот способ не требует предварительного преобразования в String, а затем в byte[], что выделяет намного больше динамической памяти, если отчет большой. Он преобразуется в байты на лету при чтении потока прямо из StringBuffer.

Используется CharSequenceInputStream из проекта ввода-вывода Apache Commons.

7 голосов
/ 24 ноября 2010
5 голосов
/ 18 мая 2012

Нельзя избежать проблем с кодировкой текста, но Apache commons-io имеет

Обратите внимание, что это библиотеки, упомянутые в ответе Питера на koders.com, просто ссылки на библиотеку вместо исходного кода.

5 голосов
/ 15 сентября 2008

Очевидные имена для этих классов - ReaderInputStream и WriterOutputStream. К сожалению, они не включены в библиотеку Java. Тем не менее, Google является вашим другом.

Я не уверен, что это обойдет все проблемы кодирования текста, которые кошмарны.

Есть RFE, , но он закрыт, не исправит.

4 голосов
/ 01 сентября 2009

Вы пытаетесь записать содержимое Reader в OutputStream? Если это так, вам будет проще обернуть OutputStream в OutputStreamWriter и записать char s из Reader в Writer, вместо того, чтобы пытаться преобразовать читатель в InputStream :

final Writer writer = new BufferedWriter(new OutputStreamWriter( urlConnection.getOutputStream(), "UTF-8" ) );
int charsRead;
char[] cbuf = new char[1024];
while ((charsRead = data.read(cbuf)) != -1) {
    writer.write(cbuf, 0, charsRead);
}
writer.flush();
// don't forget to close the writer in a finally {} block
1 голос
/ 06 августа 2017

Вы можете использовать Cactoos (без статических методов, только объекты):

Вы также можете конвертировать в обратном направлении:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...