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.
对于一个ByteArrayInputStream
,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);
InputStream
读取并写入ByteArrayOutputStream
。出于传统,I/O缓冲区的大小通常是2的幂次方。 - Joop Eggenin
就是那个ByteArrayInputStream
。对于ByteArrayInputStream#available(),我们可以这样使用。 - Joop Eggen为什么没有人提到org.apache.commons.io.IOUtils
?
import java.nio.charset.StandardCharsets;
import org.apache.commons.io.IOUtils;
String result = IOUtils.toString(in, StandardCharsets.UTF_8);
只需要一行代码。
Java 9+解决方案:
new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
使用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);
XML
或 HTML
文档,我是否能够无限制地阅读它? - Mushy使用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
InputStreamReader
,就像你提供的第二个链接中所描述的那样。ByteArrayOutputStream
不会将字节转换为字符。 - Dawood ibn Kareem问题在于它只读取到第一个行分隔符为止。它假设你要查找的字符串不包含任何行分隔符。通常情况下是这样的,但如果不是,这种方法就不会真正起作用。
这就是我不继续使用那个示例的原因。 - Mushy