Преобразовать Reader в InputStream и наоборот

В этом коротком руководстве по Java IO вы научитесь преобразовывать Reader в InputStream, а также преобразовывать InputStream в Reader.

Обратите внимание, что Reader используется для чтения символов, а InputStream — для чтения необработанных байтов. Оба были разработаны для разных целей, поэтому будьте осторожны, когда используете их в приложении.

1. Преобразование Reader в InputStream

Reader хранит символьные данные и обычно строку или массив символов. Если у нас есть доступ к String или char[], то мы можем напрямую получить InputStream из него:

 попробуйте(InputStream inputStream = new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8))){//Использовать InputStream}

Если у нас есть ссылка на существующий Reader, то мы можем использовать следующие методы для получения InputStream.

1.1. Читатель -> byte[] -> InputStream

Сначала мы получаем содержимое из Reader в byte[]. Используйте BufferedReader для лучшей производительности. Затем мы используем byte[] для создания InputStream.

Этот процесс преобразования может быть достигнут многими способами и с помощью различных библиотек. Например, давайте начнем с собственных API IO.

try(Reader reader = new BufferedReader(new StringReader(content))){char[] charBuffer = new char[8 * 1024];int numCharsRead;while((numCharsRead = reader.read(charBuffer, 0,charBuffer.length)) != -1) {builder.append(charBuffer, 0, numCharsRead);}}try(InputStream inputStream = new ByteArrayInputStream(builder.toString().getBytes(StandardCharsets.UTF_8))){//Use InputStream}

Аналогично мы можем использовать класс IOUtils.toString(reader) Common IO для чтения содержимого из Reader в String.

String content = "Hello world";try(Reader reader = new BufferedReader(new StringReader(content));InputStream inputStream = IOUtils.toInputStream(IOUtils.toString(reader), Charsets.UTF_8);) {//Use InputStream}

Мы также можем использовать класс Guava CharStreams.toString(reader), как и в предыдущем решении.

try(Reader reader = new BufferedReader(new StringReader(content));InputStream inputStream = new ByteArrayInputStream(CharStreams.toString(reader).getBytes(StandardCharsets.UTF_8))){//Use InputStream}

1.2. ReaderInputStream Commons IO

ReaderInputStream — это реализация InputStream, которая считывает поток символов из Reader.

Все операции read() буферизуются, поэтому нет необходимости оборачивать базовый Reader в BufferedReader.

try(Reader reader = new StringReader("Hello world");InputStream inputStream = new ReaderInputStream(reader, StandardCharsets.UTF_8);){//Use inputStream}

2. Преобразование InputStream в Reader

В Java есть InputStreamReader, который был специально разработан для этой цели. Этот класс работает как мост от потоков байтов к потокам символов.

Для максимальной эффективности рассмотрите возможность помещения InputStreamReader в BufferedReader.

InputStream inputStream = new ByteArrayInputStream("Hello world".getBytes());Reader reader = new BufferedReader(new InputStreamReader(inputStream));

3. Заключение

В этом уроке по Java IO мы научились выполнять преобразование между Reader и InputStream, используя простые и понятные примеры.

Исходный код на Github

Прокрутить вверх