Перейти к основному содержимому

Java — считыватель для InputStream

· 2 мин. чтения

Задача: Наибольшая подстрока без повторений

Для заданной строки s, найдите длину наибольшей подстроки без повторяющихся символов. Подстрока — это непрерывная непустая последовательность символов внутри строки...

ANDROMEDA 42

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