Java基础知识之ByteArrayInputStream流的使用

Java ByteArrayInputStream流

一、ByteArrayInputStream流定义

API说明:ByteArrayInputStream包含一个内部缓冲区,其中包含可以从流中读取的字节,内部计数器跟踪read方法提供的下一个字节,关闭ByteArrayInputStream流无效,关闭流后调用类的方法不会有异常产生

二、ByteArrayInputStream流实例域

/**

* 字节数组缓冲区,buf[0]到buf[count-1]是可以从流中读取的字节,buf[pos]是读取的下一字节

*/

protected byte buf[];

/**

*读取字节的索引

*/

protected int pos;

/**

* 流中当前标记的位置,默认标记为0,可以通过mark方法设置新的标记点,而后通过reset方法将当前位置设置为标记点

* 从标记点开始读取数据

*

* @since JDK1.1

*/

protected int mark = 0;

/**

* 索引结束位置+1,不大于缓冲区的长度

*/

protected int count;

三、ByteArrayInputStream流构造函数

/**

* 使用指定字节数组创建ByteArrayInputStream流,字节数组为流的缓冲区,

* 当前位置索引pos初始值是0,索引结束位置count的是buf的长度

*/

public ByteArrayInputStream(byte buf[]) {

this.buf = buf;

this.pos = 0;

this.count = buf.length;

}

/**

* 使用指定的数组创建ByteArrayInputStream流

* 目标数组为流的缓冲区数组

* 缓冲区当前起始位置变量值为off

* 缓冲区的索引结束位置为:buf.length和off+length的最小值

*/

public ByteArrayInputStream(byte buf[], int offset, int length) {

this.buf = buf;

this.pos = offset;

this.count = Math.min(offset + length, buf.length);

this.mark = offset;

}

四、ByteArrayInputStream流方法

1)read():从此输入流中读取下一个字节并返回,当流到达末尾时,返回-1

/**

* 从此输入流中读取下一个字节并返回

* 当流到达末尾时,返回-1

* 注意& 0xff是字节的补码操作,暂时不用理会

*/

public synchronized int read() {

return (pos < count) ? (buf[pos++] & 0xff) : -1;

}

2)read(byte b[], int off, int len):从输入流中读取最多len个字节到目标数组中,返回实际读取的字节数

/**

* 从输入流中读取最多len个字节到目标数组中,返回实际读取的字节数

* 当缓冲区中剩余字符数小于len个字节时,读取缓冲区剩余字符数

* 当剩余字符数大于len个字节时,读取len个字节

*/

public synchronized int read(byte b[], int off, int len) {

if (b == null) {

throw new NullPointerException();

} else if (off < 0 || len < 0 || len > b.length - off) {

throw new IndexOutOfBoundsException();

}

if (pos >= count) {

return -1;

}

int avail = count - pos;

if (len > avail) {

len = avail;

}

if (len <= 0) {

return 0;

}

System.arraycopy(buf, pos, b, off, len);

pos += len;

return len;

}

3)close():关闭流无效,关闭后调用其它方法不会有异常

/**

* 关闭流无效,关闭后调用其它方法不会有异常

*/

public void close() throws IOException {

}

五、ByteArrayInputStream流的作用

暂时不理解具体作用,不清楚什么时候会用到该流,因为实际项目暂未用到,故先了解其功能即可

六、ByteArrayInputStream的用法解析

看下面这个程序,看懂了就会了

import java.io.ByteArrayInputStream;

import java.io.File;

import java.io.IOException;

public class Test4 {

//ByteArrayInputStream本身操作的是一个数组,并没有打开文件描述之类的,所有不需要关闭流

public static void main(String[] args) {

ByteArrayInputStream bais=null;

StringBuilder sb=new StringBuilder();

int temp=0;

int num=0;

long date1=System.currentTimeMillis();

try{

byte[] b="abcdefghijklmnopqstuvxyz".getBytes();

//从字符数组b中读取数据,从下标为2开始计数读8个

bais=new ByteArrayInputStream(b,2,8);

while((temp=bais.read())!=-1){

sb.append((char)temp);

num++;

}

System.out.println(sb);

System.out.println("读取的字节数:"+num);

}finally{

try{

bais.close();//不需要关闭流的,但是调用close没有任何影响,close不做任何事情

}catch(IOException e){

e.printStackTrace();

}

new File("d:"+File.separator+"a.txt");//File.separator是一个文件分隔符,在windows和linux平台下运行都没有问题

}

long date2=System.currentTimeMillis();

System.out.println("耗时:"+(date2-date1));

}

}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。

以上是 Java基础知识之ByteArrayInputStream流的使用 的全部内容, 来源链接: www.h5w3.com/251469.html

回到顶部