将字节序列从此通道读入给定缓冲区的子序列中。
调用此方法会尝试最多从此通道读取 r 个字节,其中 r 是给定缓冲区数组的指定子序列中剩余的字节数,也就是
dsts[offset].remaining()
+ dsts[offset+1].remaining()
+ ... + dsts[offset+length-1].remaining()
假定读取的字节序列长度为 n,其中 0 <= n <= r。将此序列的前 dsts[offset].remaining() 个字节传输到缓冲区 dsts[offset] 中,然后将后面的 dsts[offset+1].remaining() 个字节传输到缓冲区 dsts[offset+1] 中,依此类推,直到将整个字节序列传输到给定缓冲区中。向每个缓冲区中传输尽可能多的字节,因为要保证每个已更新缓冲区(最后一个已更新缓冲区除外)的最终位置等于该缓冲区的限制。
可在任意时间调用此方法。但是如果另一个线程已经在此通道上发起了一个读取操作,则在该操作完成前此方法的调用被阻塞。
- 参数:
dsts
- 要向其中传输字节的缓冲区offset
- 第一个缓冲区(字节传输到该缓冲区中)在缓冲区数组中的偏移量;必须为非负数并且不能大于 dsts.lengthlength
- 要访问的最大缓冲区数;必须为非负数并且不能大于 dsts.length - offset
- 返回:
- 读取的字节数,可能为零,如果该通道已到达流的末尾,则返回 -1
- 抛出:
indexoutofboundsexception
- 如果关于 offset 和 length 参数的前提不成立
nonreadablechannelexception
- 如果不允许从此通道进行读取操作
closedchannelexception
- 如果此通道已关闭
asynchronouscloseexception
- 如果正在进行读取操作时另一个线程关闭了此通道
closedbyinterruptexception
- 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
ioexception
- 如果发生其他 i/o 错误