欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java IO 之ByteArrayInputStream & ByteArrayOutputStream 博客分类: 再学JavaSE javaioByteArrayInputStreamByteArrayOutputStream

程序员文章站 2024-02-24 20:33:34
...

 

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