【JAVA学习笔记】InputStream.read()三种方法解析

Read的三种方法

API reference: https://docs.oracle.com/javase/7/docs/api/
read方法介绍
Read()

  1. 返回int值,0-255。
  2. 每次从数据源读取一个byte并返回。
    read方法每次读取8个二进制位(所谓一个byte字节。字节是十进制0-255之间的一个整数),所以read就是从数据源读取一个8位二进制数(一个byte),将这个byte转换为十进制整数然后返回)。

Read(byte[] b)

  1. 返回int值,表示读取的字节数。
  2. 使用一个byte的数组作为一个缓冲区,每次从数据源中读取和缓冲区大小(二进制位)相同的数据并将其存在缓冲区中。
  3. 第一个字节会被存至b[0]中,下一个存至b[1],以此类推。总字节读取数将等于b的长度,且一个k字节的数据流将被保存在b[0]到b[k-1]中。在这一轮读取中 b[k] -b[b.length-1]将不会收到影响。
    注:虽然我们可以指定缓冲区的大小,但是read方法在读取数据的时候仍然是按照字节来读取的。在utf-8等变长编码中,一个复杂字符(比如汉字)所占字节往往大于1,并且长度往往是不固定的。按照字节读取数据会将字符割裂,这就导致我们在使用read(byte[] b)方法读取文件时,虽然指定了缓冲区的大小,但是仍然会出现乱码。

Read(byte[] b, int off, int len)

  1. 从inputstream读取最多len个字节存至b。返回int,表示实际读取的字节数。
  2. 第一个字节会被存至b[off]中,下一个存至b[off+1],以此类推。总字节读取数将等于len的长度,且一个k字节的数据流将被保存在b[off]到b[off+k-1]中。在这一轮读取中 b[off+k] - b[off+len-1]将不会收到影响。
  3. In every case, b[0] - b[off] 和 b[off+len] - b[b.length-1]的元素不会受到影响.
    注:len不能随意往大了取,异常:IndexOutOfBoundsException - If off is negative, len is negative, or len is greater than b.length - off
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值