Java - Reader para InputStream

Java - Reader para InputStream

Neste tutorial rápido, vamos dar uma olhada emthe conversion from a Reader to an InputStream - primeiro com Java puro, depois com Guava e finalmente com a biblioteca IO do Apache Commons.

Este artigo faz parte dethe “Java – Back to Basic” series aqui no exemplo.

1. Com Java

Vamos começar com a solução 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();
}

Observe que estamos lendo (e gravando) blocos de dados por vez.

2. Com goiaba

A seguir - vamos dar uma olhada emmuch simpler Guava solution:

@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();
}

Observe que estamos usando um fluxo de entrada pronto para uso que transforma toda a conversão em um único revestimento.

3. Com Commons IO

Finalmente - vamos olhar parathe Commons IO solution - também um liner simples:

@Test
public void givenUsingCommonsIO_whenConvertingReaderIntoInputStream()
  throws IOException {
    Reader initialReader = new StringReader("With Commons IO");

    InputStream targetStream =
      IOUtils.toInputStream(IOUtils.toString(initialReader), Charsets.UTF_8);

    initialReader.close();
    targetStream.close();
}

Observe que estamos lidando com qualquer tipo de leitor - mas se você estiver trabalhando especificamente com dados de texto, é sempre uma boa ideia especificar o conjunto de caracteres explicitamente em vez de usar o padrão JVM.

E aí está - 3 maneiras simples de transformarReader emInputStream.