java.nio.channels

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

public interface GatheringByteChannel
     
extends WritableByteChannel

可从缓冲区序列写入字节的通道。

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

从以下版本开始:
1.4

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

方法详细信息

write

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

尝试最多向此通道中写入 r 个字节,其中 r 是给定缓冲区数组的指定子序列中剩余的字节数,也就是

 srcs[offset].remaining()
     + srcs[offset+1].remaining()
     + ... + srcs[offset+length-1].remaining()

假定写入长度为 n 的字节序列,其中 0 <= n <= r。从缓冲区 srcs[offset] 中写入此序列的前 srcs[offset].remaining() 个字节,然后从缓冲区 srcs[offset+1] 中写入后面的 srcs[offset+1].remaining() 个字节,依此类推,直到写入整个字节序列。从每个缓冲区中写入尽可能多的字节,因为要保证每个已更新缓冲区(最后一个已更新缓冲区除外)的最终位置等于该缓冲区的限制。

除非另行指定,否则仅在写入所有请求的 r 个字节后 write 操作才会返回。有些类型的通道(取决于它们的状态)可能仅写入某些字节或者可能根本不写入。例如,处于非阻塞模式的套接字通道无法写入超出该套接字输出缓冲区剩余空间的字节。

可在任意时间调用此方法。但是如果另一个线程已经在此通道上发起了一个写入操作,则在该操作完成前此方法的调用被阻塞。

参数:
src - 要获取其中字节的缓冲区
offset - 第一个缓冲区(要获取该缓冲区中的字节)在缓冲区数组中的偏移量;必须为非负数并且不能大于 srcs.length
length - 要访问的最大缓冲区数;必须为非负数并且不能大于 srcs.length -  offset
返回:
写入的字节数,可能为零
抛出:
IndexOutOfBoundsException - 如果关于 offsetlength 参数的前提不成立
NonWritableChannelException - 如果不允许对此通道进行写入操作
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException - 如果发生其他 I/O 错误

write

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

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

 c.write(srcs, 0, srcs.length);

参数:
src - 要获取其中字节的缓冲区
返回:
写入的字节数,可能为零
抛出:
NonWritableChannelException - 如果不允许对此通道进行写入操作
ClosedChannelException - 如果此通道已关闭
AsynchronousCloseException - 如果正在进行写入操作时另一个线程关闭了此通道
ClosedByInterruptException - 如果正在进行写入操作时另一个线程中断了当前线程,因此关闭了该通道并将当前线程的状态设置为中断
IOException - 如果发生其他 I/O 错误