博客引用处(以下内容在原有博客基础上进行补充或更改,谢谢这些大牛的博客指导):
InputStream转ByteArrayOutputStream
ByteArrayOutputStream和ByteArrayInputStream详解(转)
java.ByteArrayInputStream与ByteArrayOutputStream再次理解
ByteArrayOutputStream或ByteArrayInputStream不需要关闭流原因分析
ByteArrayOutputStream类是在创建它的实例时,程序内部创建了一个byte型的数组缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组缓冲区中 写入 或 读出 byte型数据。在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。具体用法如下:
- ByteArrayOutputStream: 将捕获的数据,转换成字节数组放在内存缓冲区中。
- ByteArrayInputStream: 可以将内存缓冲区中的字节数组转化为输入流
Inputstream 转 ByteArrayOutputStream 在转 ByteArrayInputStream 再转回Inputstream
public static void main(String[] args) throws IOException {
InputStream inputStream = new FileInputStream(new File("c:\\logo.jpg"));//原始输入流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
byte[] dataBytes;
while ((len = inputStream.read(buffer)) != -1 ) {
baos.write(buffer, 0, len);
}
baos.flush(); // 对ByteArrayOutputStream 来说flush是没什么用的,但是有时确实需要,加在转换前或者转换后
dataBytes = baos.toByteArray();
InputStream is = new ByteArrayInputStream(dataBytes);//转换后的输入流
baos.flush(); //加在转换前不行,就放在转换后
inputStream.close(); //需要关闭流,在使用关闭之后
}
说明:
ByteArrayOutputStream ByteArrayInputStream 不需要关闭流,即使关闭了,它们对应的方法还是可以使用,因为它们是内存读写流,不同于指向硬盘的流,它内部是使用字节数组读/写内存的,这个字节数组是它的成员变量,当这个数组不再使用变成垃圾的时候,Java的垃圾回收机制会将它回收。所以不需要关流。
DataOutputStream 与 DataInputStream 的搭配使用
ByteArrayOutputStream bout = new ByteArrayOutputStream();
DataOutputStream dout = new DataOutputStream(bout);
String name = "xxy";
int age = 84;
dout.writeUTF(name);
dout.writeInt(age);
byte[] buff = bout.toByteArray();
ByteArrayInputStream bin = new ByteArrayInputStream(buff);
DataInputStream dis = new DataInputStream(bin);
String newName = dis.readUTF();
int newAge = dis.readInt();
System.out.println(newName+":"+newAge);
结果:
xxy . 84