Module java.base

Interface GatheringByteChannel

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

public interface GatheringByteChannel extends WritableByteChannel
一个可以从一系列缓冲区中写入字节的通道。

一个聚集写操作在单个调用中从给定的一系列缓冲区中的一个或多个中写入字节序列。聚集写通常在实现网络协议或文件格式时非常有用,例如,将数据分组为一个或多个固定长度头部后跟可变长度主体的段。类似的分散读操作在ScatteringByteChannel接口中定义。

自 JDK 版本:
1.4
  • Method Summary

    Modifier and Type
    Method
    Description
    long
    write(ByteBuffer[] srcs)
    从给定的缓冲区向此通道写入字节序列。
    long
    write(ByteBuffer[] srcs, int offset, int length)
    从给定缓冲区的子序列向此通道写入字节序列。

    Methods declared in interface java.nio.channels.Channel

    close, isOpen

    Methods declared in interface java.nio.channels.WritableByteChannel

    write
  • Method Details

    • 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 字节后才返回。某些类型的通道,根据其状态,可能只写入部分字节,或者可能根本不写入任何字节。例如,非阻塞模式下的套接字通道不能写入超出套接字输出缓冲区中可用字节的字节。

      此方法可以随时调用。但是,如果另一个线程已经启动了对此通道的写操作,则此方法的调用将阻塞,直到第一个操作完成。

      参数:
      srcs - 要检索字节的缓冲区
      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);
      
      参数:
      srcs - 要检索字节的缓冲区
      返回:
      写入的字节数,可能为零
      抛出:
      NonWritableChannelException - 如果此通道未打开以进行写入
      ClosedChannelException - 如果此通道已关闭
      AsynchronousCloseException - 如果另一个线程在写操作进行中关闭此通道
      ClosedByInterruptException - 如果另一个线程在写操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态
      IOException - 如果发生其他 I/O 错误