Java基础知识之ByteArrayInputStream流的使用
作者:咕噜是个大胖子 发布时间:2023-10-27 14:37:53
标签:Java,ByteArrayInputStream,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));
}
}
来源:https://blog.csdn.net/ai_bao_zi/article/details/81355044


猜你喜欢
- 实践过程效果代码public partial class frmSend : Form{ public frmSe
- 发现问题肯定有人发现连接mysql失败,然后又找不到问题所在,又出现一大最报错,如下图。解决过程 1.先查询自己的java版本,在
- 前言在上一篇通知服务NotificationListenerService使用方法 中,我们已经介绍了如何使用NotificationLis
- 使用DataGridView控件绑定数据后有时需要清空绑定的数据,在清除DataGridView绑定的数据时:1、设置DataSource为
- 重写 equals()方法 和 hashCode()方法最近看了学习了集合的简单的知识,碰到了讲解 Set 的部分,感觉很好奇,这里对于 S
- 装箱(boxing)和拆箱(unboxing)是C#类型系统的核心概念.是不同于C与C++的新概念!,通过装箱和拆箱操作,能够在值类型和引用
- RestAPI中, 经常需要操作json字符串, 需要把json字符串"反序列化"成一个对象, 也需要把一个
- 本文实例为大家分享了Java实现简单猜拳游戏的具体代码,供大家参考,具体内容如下看网上的猜拳游戏那么多,但都是用switch输入数字,所以用
- 在使用 SpringMVC 上传文件时,接收到的文件格式为 MultipartFile,但是在很多场景下使用都需要File格式的文件,记录下
- 本文实例讲述了C#串口通信实现方法。分享给大家供大家参考。具体方法如下:通过COM1发送数据,COM2接收数据。当COM2接收完本次发送的数
- 一、题目描述题目:使用ThreadLocal管理一号和二号线程,分别存入100元,在三号线程中使用利用一号和二号的计算结果来算出账户的实际金
- 使用FastJson解决long类型在js中失去精度问题1.pom中需要将默认的jackson排除掉<dependency>&n
- 这几天在弄后端管理系统向指定的Android
- tcp客户端示例#include <errno.h> #include <sys/socket.h> #includ
- 最近一直在写c#的时候一直遇到这个报错,看的我心烦。。。准备记下来以备后续只需。参考博客:https://segmentfault.com/
- 一、Flutter介绍Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。Flutter可以与现
- 本文实例为大家分享了Java开发实现人机猜拳游戏的具体代码,供大家参考,具体内容如下猜拳游戏游戏规则:人和电分别出剪刀、石头、布,直到人战胜
- 目录概述语法索引器(Indexer)的用途重载索引器(Indexer)概述索引器(Indexer) 允许一个对象可以像数组一样使用下标的方式
- 引言 在多线程中,为了使线程安全,我们经常会使用synchronized和Lock进行代码同步和加锁,但是具体两者有什么区别,什
- ArrayList和LinkedList都实现了List接口,有以下的不同点:1、ArrayList是基于索引的数据接口,它的底层是数组。它