31

我读了这篇文章,但我没有关注。我已经看到了这一点,但还没有看到将 a 转换ByteArrayInputStreamString使用 a的正确示例ByteArrayOutputStream

要检索 aByteArrayInputStream作为 a的内容String,是使用ByteArrayOutputstream推荐的还是有更可取的方法?

我正在考虑这个例子,并扩展ByteArrayInputStream和利用装饰器来增加运行时的功能。有兴趣将其作为使用 的更好解决方案ByteArrayOutputStream吗?

4

5 回答 5

47

AByteArrayOutputStream可以从任何读取,InputStream最后产生 a 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.

对于 aByteArrayInputStream available()产生总字节数。


附录 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();

这里可能是任何 InputStream。


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

String s = baos.toString(StandardCharsets.UTF_8);
于 2014-06-05T11:52:43.510 回答
29

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

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

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

就一行代码。

于 2017-02-21T07:08:13.687 回答
7

Java 9+ 解决方案:

new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
于 2020-02-02T08:52:48.933 回答
1

使用Scanner并传递给它的构造函数,ByteArrayInputStream然后从你的 Scanner 读取数据,检查这个例子:

ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(new byte[] { 65, 80 });
Scanner scanner = new Scanner(arrayInputStream);
scanner.useDelimiter("\\Z");//To read all scanner content in one String
String data = "";
if (scanner.hasNext())
    data = scanner.next();
System.out.println(data);
于 2014-06-05T11:51:07.413 回答
1

使用 Base64 编码

假设你有你的 ByteArrayOutputStream :

ByteArrayOutputStream baos =...
String s = new String(Base64.Encoder.encode(baos.toByteArray()));

请参阅http://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html

于 2014-06-05T12:19:36.660 回答