В этом коротком руководстве по 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, используя простые и понятные примеры.