ByteArrayInputStream和ByteArrayOutputStream

ByteArrayInputStream的精髓是将一个字节数组包装到流中
有这样一个场景:
客户端和服务器端交互,当连接建立之后,如果只是根据协议用DataInputStream的readInt() 或者readByte() 等固定方法一个一个的读,那是相当消耗资源的,如果一次将所需要的数据读取完毕,然后剩下的就是本地解析,那就省了不少交互资源

 

int packetlen = din.readInt();
int len = packetlen-4;
byte[] b = new byte[len];
din.readFully(b);

 

这段代码一次读够了客户端过来的数据

然后

ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(b);
DataInputStream dataInputStream = new DataInputStream(byteArrayInputStream);
//此时的输入流已经是本地的输入流了,在本地你可以随心所欲
dataInputStream.readByte() 
dataInputStream.readInt() 
.....

 

 

ByteArrayOutputStream创建一个新的字节数组输出流
场景如下:服务器端处理完毕需要往客户端返回数据,如果使用DataOutputStream的writeInt(int v)或者writeByte(int v)等方法一个一个的写,那么和读取的场景性质就一样了:交互资源是相当消耗的;因此如果现在本地把数据组织完毕之后,能一次传送,就好了。

声明字节数组输出流

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(29);

 

对字节数组输出流进行包装,这样写入的时候,数据真正进入的还是ByteArrayOutputStream

DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream);

 

往流当中写入数据

dataOutputStream.writeInt(29);//packetlen
dataOutputStream.writeInt(JVConstant.SGIP_BIND_RESP);//command
dataOutputStream.write(sequence);//sequence-number
dataOutputStream.writeByte(0);//Result
byte[] reserve = new byte[8];
dataOutputStream.write(reserve);//Reserve
dataOutputStream.flush();

 

从字节数组输出流当中将数据读取出来

byte[] result = byteArrayOutputStream.toByteArray();

 

关闭流

byteArrayOutputStream.close();
dataOutputStream.close();

 

返回字节数据

return result;

 

你可能感兴趣的:(ByteArrayInputStream和ByteArrayOutputStream)