Reader转为InputStream

2025/04/06

1. 概述

在本快速教程中,我们将研究从Reader到InputStream的转换-首先使用纯Java,然后使用Guava,最后使用Apache Commons IO库。

2. 普通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();
}

请注意,我们一次读取(和写入)数据块。

3. 使用Guava

接下来让我们看看更简单的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();
}

请注意,我们使用的是开箱即用的输入流,它将整个转换过程转变为一行代码。

4. 使用Commons IO

最后,让我们看几个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();
}

请注意,我们在这里处理任何类型的读取器-但如果你专门处理文本数据,那么明确指定字符集而不是使用JVM默认值始终是个好主意。

5. 总结

以上就是将Reader转换为InputStream的3种简单方法。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章