Как преобразовать Reader в InputStream, а Writer - в OutputStream?

StackOverflow https://stackoverflow.com/questions/62241

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

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

new ByteArrayInputStream(inputString.getBytes("UTF-8"))

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

Что касается того, как на самом деле это сделать, как уже было указано, "очевидными названиями для этих классов являются ReaderInputStream Читательский входной поток и Поток вывода WriterOutputStream." Удивительно, но..."они не включены в библиотеку Java" даже несмотря на то, что "противоположные" классы, InputStreamReader ( Входной поток чтения) и OutputStreamWriter ( Выходной поток ) являются включено.

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

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

Н.Б.В комментарии к одному из других приведенных здесь ответов упоминается этот баг.Но это влияет на Apache Муравей Класс ReaderInputStream (здесь), нет апачи Общий доступ IO Класс ReaderInputStream.

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

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

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

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

new CharSequenceInputStream(html, StandardCharsets.UTF_8);

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

Он использует CharSequenceInputStream Последовательность символов из проекта ввода-вывода Apache Commons.

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

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

Есть RFE, но это Закрыто, ничего не исправишь.

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

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

Вы пытаетесь записать содержимое Reader к OutputStream?Если это так, вам будет легче обернуть OutputStream в OutputStreamWriter и напишите следующее charы из 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

Предупреждение при использовании WriterOutputStream - он не всегда обрабатывает запись двоичных данных в файл должным образом / так же, как обычный выходной поток.У меня была проблема с этим, и мне потребовалось некоторое время, чтобы разобраться.

Если вы можете, я бы рекомендовал использовать выходной поток в качестве основы, и если вам нужно писать строки, используйте для этого оболочку OutputStreamWriter вокруг потока.Гораздо надежнее преобразовывать текст в байты, чем наоборот, и, вероятно, именно поэтому WriterOutputStream не является частью стандартной библиотеки Java

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

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

Для чтения строки в потоке используется только то, что предоставляет java.

InputStream s = new BufferedInputStream( new ReaderInputStream( new StringReader("a string")));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top