博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO之ByteArrayInputStream源码分析
阅读量:6532 次
发布时间:2019-06-24

本文共 1883 字,大约阅读时间需要 6 分钟。

分析开始

  • ByteArrayInputStream一共有四个属性
protected byte buf[];//存放数据    protected int pos;//读取数据的偏移量    protected int mark = 0;//对读取数据做一个标记    protected int count;//count=buf.length 数据量的大小
  • read()方法主要是先判断数据是否读完,如果读完则返回-1(所以数据读完了我们会经常用read()==-1来判断),如果没有读完则读取pos的数据然后将pos加1,那么下次则读取的数据是pos则是1,接着是一个 & 0xff的操作,这个其实是将byte数据转换成int数据,是通过位运算高位补0,例如byte的值是5,那么byte的二进制是0000 0101,那么& 0xff的操作是 0000 0101 & 1111 1111 1111 1111 1111 1111 1111 1111 = 0000 0000 0000 0000 0000 0000 0000 0101,结果没变只不过是把byte类型转换成int类型了。说明下java里,一个byte是占1个字节(8位),一个int是4个字节(32位)
public synchronized int read() {        return (pos < count) ? (buf[pos++] & 0xff) : -1;  }
  • 还有read()的方法,这个方法主要是将数据读到第一个参数的byte[]里去,与上面read()的差别是这个是有点像是一下读去一块数据,所以效率会比上面一个块,第二的参数off是从哪个位置开始读,len是读取的需要读取的长度是多少,读完后会将pos的位置加上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) {        //装数据byte[]的长度一定要小于,读取的长度-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);//拷贝数据到byte[]块里        pos += len;//设置读取的偏移量        return len;    }
  • skip()这个方法是跳过不需要读取的数据,然后直接读取想要的数据。主要实现是通过改变属性pos的值来实现的
public synchronized long skip(long n) {        long k = count - pos;        if (n < k) {            k = n < 0 ? 0 : n;        }        pos += k;        return k;    }
  • mark(),rest()这两个方法是mark()对数据做标记,然后通过reset()方法重置,主要为了方便重复读取流的数据
public void mark(int readAheadLimit) {        mark = pos;    }    public synchronized void reset() {        pos = mark;    }

以上就是ByteArrayInputStream的核心实现,其实可以看到关键的方法都是synchronized的,说明io流都是阻塞的。

转载地址:http://hgqbo.baihongyu.com/

你可能感兴趣的文章
J2EE分布式框架--单点登录集成方案
查看>>
跨域传递参数
查看>>
android 4.2的新特性layoutRtl,让布局自动从右往左显示
查看>>
iOS tableView 下拉列表的设计
查看>>
sharepoint 2010 属性编辑工具 SPCamlEditor 1.5.1
查看>>
linux下配置网络环境
查看>>
java Windows7 下环境变量设置
查看>>
NBU异构还原Oracle完整备份的一些总结
查看>>
freeBSD安装详细讲解
查看>>
WSFC2016 VM弹性与存储容错
查看>>
文档管理,文本编辑控件TX Text Control .NET for WPF
查看>>
复习 Python 匿名函数 内建函数
查看>>
Security Identifiers | Win SRV2016 SID Change 修改
查看>>
看看来自日本的扫描,做网站需要注意的
查看>>
JDK 1.7+Android SDK+IntelliJ IDEA 13+Genymotion 安卓开发环境部署
查看>>
钓鱼邮件***防范指南
查看>>
session_start()放置位置的不正确引发的ROOT常量 未定义的错误
查看>>
如何设定VDP同时备份的任务数?
查看>>
ipsec的***在企业网中的经典应用
查看>>
过来人谈《去360还是留在百度?》
查看>>