java.nio.channels

接口
异常
所有超级接口:
Channel, Closeable, ReadableByteChannel
所有已知实现类:
DatagramChannel, FileChannel, Pipe.SourceChannel, SocketChannel

public interface ScatteringByteChannel
     
extends ReadableByteChannel

可将字节读入缓冲区序列的通道。

分散 读取操作可在单个调用中将一个字节序列读入一个或多个给定的缓冲区序列。分散读取通常在实现网络协议或文件格式时很有用,例如将数据分组放入段中(这些段由一个或多个长度固定的头,后跟长度可变的正文组成)。在 GatheringByteChannel 接口中定义了类似的集中 写入操作。

从以下版本开始:
1.4

方法摘要
 long read(ByteBuffer[] dsts)
          将字节序列从此通道读入给定的缓冲区。
 long read(ByteBuffer[] dsts, int offset, int length)
          将字节序列从此通道读入给定缓冲区的子序列中。
 
从接口 java.nio.channels.ReadableByteChannel 继承的方法
read
 
从接口 java.nio.channels.Channel 继承的方法
close, isOpen
 

方法详细信息

read

long read(ByteBuffer[] dsts,
          int offset,
          int length)
          throws IOException
将字节序列从此通道读入给定缓冲区的子序列中。

调用此方法会尝试最多从此通道读取 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.length
length - 要访问的最大缓冲区数;必须为非负数并且不能大于 dsts.length -  offset
返回:
读取的字节数,可能为零,如果该通道已到达流的末尾,则返回 -1
抛出:
IndexOutOfBoundsException - 如果关于 offsetlength 参数的前提不成立
NonReadableChannelException - 如果不允许从此通道进行读取操作
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException - 如果发生其他 I/O 错误

read

long read(ByteBuffer[] dsts)
          throws IOException
将字节序列从此通道读入给定的缓冲区。

调用此方法的形式为 c.read(dsts),该调用与以下调用完全相同:

 c.read(dsts, 0,dsts.length);

参数:
dsts - 要向其中传输字节的缓冲区
返回:
读取的字节数,可能为零,如果该通道已到达流的末尾,则返回 -1
抛出:
NonReadableChannelException - 如果不允许从此通道进行读取操作
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行读取操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行读取操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程设置为中断状态
IOException - 如果发生其他 I/O 错误