将字节数组输入流的内容转换为字符串

我读了这篇文章,但我没有关注。我已经看到了这一点,但还没有看到将a转换为使用.ByteArrayInputStreamStringByteArrayOutputStream

要检索 a 的内容,是使用推荐的还是有更可取的方法?ByteArrayInputStreamStringByteArrayOutputstream

我正在考虑这个例子,并扩展和利用装饰器来增加运行时的功能。任何兴趣认为这是一个更好的解决方案来雇用一个 ?ByteArrayInputStreamByteArrayOutputStream


答案 1

A 可以从任何读取,并在最后生成 .ByteArrayOutputStreamInputStreambyte[]

但是,使用它更简单: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.

对于 ,产生总字节数。ByteArrayInputStreamavailable()


附录 2021-11-16

从java 9开始,您可以使用较短的readAllBytes

byte[] bytes = in.readAllBytes();

评论答案:使用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();

这里可以是任何输入流。


由于java 10还有一个.ByteArrayOutputStream#toString(Charset)

String s = baos.toString(StandardCharsets.UTF_8);

答案 2

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

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

String result = IOUtils.toString(in, StandardCharsets.UTF_8);

只需一行代码。