В этом кратком руководстве мы рассмотрим преобразование из Reader
в InputStream
— сначала с помощью простой Java, затем с помощью Guava и, наконец, с библиотекой ввода-вывода Apache Commons.
Эта статья является частью серии «Java — Back to Basic» здесь, на ForEach.
1. С Java
Начнем с решения Java:
@Test
public void givenUsingPlainJava_whenConvertingReaderIntoInputStream_thenCorrect()
throws IOException {
Reader initialReader = new StringReader("With Java");
char[] charBuffer = new char[8 * 1024];
StringBuilder builder = new StringBuilder();
int numCharsRead;
while ((numCharsRead = initialReader.read(charBuffer, 0, charBuffer.length)) != -1) {
builder.append(charBuffer, 0, numCharsRead);
}
InputStream targetStream = new ByteArrayInputStream(
builder.toString().getBytes(StandardCharsets.UTF_8));
initialReader.close();
targetStream.close();
}
Обратите внимание, что мы одновременно читаем (и записываем) фрагменты данных.
2. С гуавой
Далее — давайте посмотрим на гораздо более простое решение Guava :
@Test
public void givenUsingGuava_whenConvertingReaderIntoInputStream_thenCorrect()
throws IOException {
Reader initialReader = new StringReader("With Guava");
InputStream targetStream =
new ByteArrayInputStream(CharStreams.toString(initialReader)
.getBytes(Charsets.UTF_8));
initialReader.close();
targetStream.close();
}
Обратите внимание, что мы используем готовый входной поток, который превращает все преобразование в один лайнер.
3. С вводом-выводом Commons
Наконец, давайте взглянем на пару решений Commons IO — тоже простых однострочных.
Во- первых, используя ReaderInputStream :
@Test
public void givenUsingCommonsIOReaderInputStream_whenConvertingReaderIntoInputStream()
throws IOException {
Reader initialReader = new StringReader("With Commons IO");
InputStream targetStream = new ReaderInputStream(initialReader, Charsets.UTF_8);
initialReader.close();
targetStream.close();
}
Наконец, то же преобразование с использованием IOUtils
:
@Test
public void givenUsingCommonsIOUtils_whenConvertingReaderIntoInputStream()
throws IOException {
Reader initialReader = new StringReader("With Commons IO");
InputStream targetStream =
IOUtils.toInputStream(IOUtils.toString(initialReader), Charsets.UTF_8);
initialReader.close();
targetStream.close();
}
Обратите внимание, что здесь мы имеем дело с любым типом Reader, но если вы работаете конкретно с текстовыми данными, всегда лучше указать кодировку явно, а не использовать кодировку JVM по умолчанию.
4. Вывод
Вот и все — 3 простых способа превратить Reader
в InputStream
. Обязательно ознакомьтесь с образцом на GitHub .