Java IO 之ByteArrayInputStream & ByteArrayOutputStream 博客分类: 再学JavaSE javaioByteArrayInputStreamByteArrayOutputStream
一、ByteArrayOutputStream
ByteArrayOutputStream(int size) 创建一个新的 byte 数组输出流,它具有指定大小的缓冲区容量(以字节为单位)。
此类实现了一个输出流,缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()和 toString()获取数据。
关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。
ByteArrayOutputStream常用于存储数据以用于一次写入
二、ByteArrayInputStream
ByteArrayInputStream(byte[] buf) 创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。
作用:把字节串/字节数组转换成一种输入流的形式,这样就可以被高级输入工具DataInputStream直接处理,比如处理成各种类型,double,float,char,int, short,long,或任何对象,或字符串,或媒体数据。把一块内存作为输入的一种方式。用处很多。
个人认为一个比较好的用途是在网络中读取数据包,由于数据包一般是定长的,我们可以先分配一个够大的byte数组,比如byte buf[]=new byte[1024];
然后调用某个方法得到网络中的数据包,例如:
Socket s=...;
DataInputStream dis=new DataInputStream(s.getInputStream());
dis.read(buf);//把所有数据存到buf中
ByteArrayInputStream bais=new ByteArrayInputStream(buf); //把刚才的部分视为输入流
DataInputStream dis_2=new DataInputStream(bais);
//现在可以使用dis_2的各种read方法,读取指定的字节
上面的示例的两次包装看上去有点多此一举,但使用ByteArrayInputStream的好处是关掉流之后它的数据仍然存在。
import java.io.*; public class ByteStreamTest { public static void main(String[] args)throws Exception { ByteArrayOutputStream bOutput = new ByteArrayOutputStream(8); byte[] b = "abcde".getBytes(); bOutput.write(b); for(int x=0; x<b.length; x++){ System.out.print((char)b[x] +" "); } System.out.println(" "); ByteArrayInputStream bInput = new ByteArrayInputStream(b); System.out.println("转换成大写字母后"); int c; for(int y=0; y<1; y++){ // 注意:这里我们一个一个字节的读 while((c=bInput.read())!=-1){ System.out.print(Character.toUpperCase((char)c)+" "); } bInput.reset(); } } }
a b c d e
转换成大写字母后
A B C D E
上一篇: Struts2实现多文件上传功能