Java IO 之ByteArrayInputStream & ByteArrayOutputStream

 

一、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 

 

参考:http://blog.csdn.net/rcoder/article/details/6118313

发布了73 篇原创文章 · 获赞 4 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章