Module java.base

Interface ScatteringByteChannel

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

public interface ScatteringByteChannel extends ReadableByteChannel
可以将字节读入一系列缓冲区的通道。

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

自 JDK 版本:
1.4
  • Method Summary

    Modifier and Type
    Method
    Description
    long
    read(ByteBuffer[] dsts)
    从此通道读取一系列字节到给定的缓冲区中。
    long
    read(ByteBuffer[] dsts, int offset, int length)
    从此通道读取一系列字节到给定缓冲区的子序列中。

    Methods declared in interface java.nio.channels.Channel

    close, isOpen

    Methods declared in interface java.nio.channels.ReadableByteChannel

    read
  • Method Details

    • 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 参数上的先决条件不成立
      IllegalArgumentException - 如果任何缓冲区是只读的
      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
      抛出:
      IllegalArgumentException - 如果任何缓冲区是只读的
      NonReadableChannelException - 如果此通道未打开以进行读取
      ClosedChannelException - 如果此通道已关闭
      AsynchronousCloseException - 如果另一个线程在读取操作进行中关闭了此通道
      ClosedByInterruptException - 如果另一个线程在读取操作进行中中断了当前线程,从而关闭了通道并设置了当前线程的中断状态
      IOException - 如果发生其他 I/O 错误