将ByteArrayInputStream的内容转换为String

Mus*_*shy 22 java string bytearrayoutputstream bytearrayinputstream

我读过这篇文章,但我没有关注.我已经看过这个,但还没有看到一个将a转换ByteArrayInputStreamString使用a 的正确例子ByteArrayOutputStream.

要检索的内容ByteArrayInputStreamString,使用ByteArrayOutputstream推荐的还是有一个更可取的方法?

我正在考虑这个例子并扩展ByteArrayInputStream和利用一个Decorator来增加运行时的功能.任何对此的兴趣都是采用ByteArrayOutputStream?的更好解决方案?

Joo*_*gen 34

A ByteArrayOutputStream可以从任何一个读取,InputStream最后产生一个byte[].

然而,ByteArrayInputStream它更简单:

int n = in.available();
byte[] bytes = new byte[n];
in.read(bytes, 0, n);
String s = new String(bytes, StandardCharsets.UTF_8); // Or any encoding.
Run Code Online (Sandbox Code Playgroud)

对于ByteArrayInputStream available()yield,总字节数.


回答评论:使用ByteArrayOutputStream

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[8192];
for (;;) {
    int nread = in.read(buf, 0, buf.length);
    if (nread <= 0) {
        break;
    }
    baos.write(buf, 0, nread);
}
in.close();
baos.close();
byte[] bytes = baos.toByteArray();
Run Code Online (Sandbox Code Playgroud)

这里可能是任何InputStream.

  • 我已经扩展了答案。原则上,一个循环从 `InputStream` 读取并写入 `ByteArrayOutputStream`。传统上,I/O 缓冲区的大小是 2 的幂。 (2认同)

Che*_*rry 14

为什么没人提到org.apache.commons.io.IOUtils

import java.nio.charset.StandardCharsets;
import org.apache.commons.io.IOUtils;

String result = IOUtils.toString(in, StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

只需一行代码.

  • 我添加了两个必需的 `import` 语句,这样不是每个人都必须搜索它们。对不起......它不再只是一行代码了;) (3认同)

Zhe*_*lov 7

Java 9+ 解决方案:

new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)