现在的位置: 首页 > 综合 > 正文

ByteArrayOutputStream和ByteArrayInputStream详解

2018年12月11日 ⁄ 综合 ⁄ 共 2954字 ⁄ 字号 评论关闭

ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。具体用法如下: 
ByteArrayOutputStream:    可以捕获内存缓冲区的数据,转换成字节数组。 
ByteArrayInputStream: 可以将字节数组转化为输入流 
1 import java.io.*; 
2  3  public class test { 
4   public static void main(String[] args) { 
5   int a=0; 
6   int b=1; 
7   int c=2; 
8   ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
9   bout.write(a); //需要注意的是write只能是0-255之间的数字,否则超出byte的表示范围,会丢失信息。如果a=257, 写入bout的只是1
10   bout.write(b); 
11   bout.write(c); 
12   byte[] buff = bout.toByteArray(); 
13   for(int i=0; i<buff.length; i++) 
14    System.out.println(buff[i]); 
15   System.out.println("***********************"); 
16   ByteArrayInputStream bin = new ByteArrayInputStream(buff); 
17    while((b=bin.read())!=-1) { 
18    System.out.println(b); 
19   } 
20  } 
21 } 

22 

ByteArrayOutputStream在内部会建立一个byte数组,调用write操作就是把字节写入这个数组,调用toByteArray会将内部byte数组的内容复制到一个新的byte数组中并返回新的数组

要使用ByteArrayInoutStream, 必须将一个byte数组传入,然后就是以操作流的方式操作这个数组,感觉用处不大

如上所示,ByteArrayOutputStream把内存中的数据读到字节数组中,而ByteArrayInputStream又把字节数组中的字节以流的形式读出,实现了对同一个字节数组的操作. 
综合DataOutputStream&DataInputStream的作用和功能,与ByteArrayOutputStream和ByteArrayInputSream使用将更方便.此时DataOutputStream&DataInputStream封闭了字节流,以适当的形式读出了字节数组中的数据.如下所示: 
1 import java.io.*; 

3  public class test { 
4   public static void main(String[] args)throws IOException { 
5   ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
6   DataOutputStream dout = new DataOutputStream(bout); 
7   String name = "xxy"; 
8   int age = 84; 
9   dout.writeUTF(name); 
10   dout.writeInt(age); 
11   byte[] buff = bout.toByteArray(); 
12   ByteArrayInputStream bin = new ByteArrayInputStream(buff); 
13   DataInputStream dis = new DataInputStream(bin); 
14   String newName = dis.readUTF(); 
15   int newAge = dis.readInt(); 
16   System.out.println(newName+":"+newAge); 
17  } 
18 } 



字节数组流: 
ByteArrayOutputStream:    可以捕获内存缓冲区的数据,转换成字节数组。 
ByteArrayoutputStream bout=new ByteArrayOutputStream(); 
bout.write(int a);  bout.write(int b);  bout.write(int c); 
byte[] buf=bout.toByteArray();//获取内存缓冲中的数据 
for(int i=0;i<=buf.length;i++) 

  System.out.println(buf[i]); 

bout.close(); 
注:通过调用reset()方法可以重新定位。 
ByteArrayInputStream: 可以将字节数组转化为输入流 
ByteArrayInputStream bin=new ByteArrayInputStream(byte[] buf); 
int data=0; 
while( (b=bin.read())!=-1) 

  System.out.println(b); 

bin.close(); 

与DataOutputStream&DataInputStream联合使用: 

ByteArrayOutputStream bout=new ByteArrayOutputStream(); 
DataOutputStream dos=new DataOutputStream(bout); 
String name="suntao"; 
int age=19; 
dos.writeUTF(name); 
dos.writeInt(age); 
byte[] buf=bout.toByteArray();//获取内存缓冲区中的数据 
dos.close(); 
bout.close(); 

ByteArrayInputStream bin=new ByteArrayInputStream(byte[] buf); 
DataInputStream dis=new DataInputStream(bin); 
String name=dis.readUTF();//从字节数组中读取 
int age=dis.readInt(); 
dis.close(); 
bin.close(); 

注:  DataInputStream&DataOutputStream还可以与FileInputStream&FileOutputStream 
联合使用。 
其中: 
DataInputStream&DataOutputStream关心如何将数据从高层次的形式转化成低层次的形式. 
FileInputStream&FileOutputStream关心如何操作存储单元以接受和产生数据。

抱歉!评论已关闭.