- 所有超级接口:
-
AutoCloseable
,Channel
,Closeable
,WritableByteChannel
- 所有已知实现类:
-
DatagramChannel
,FileChannel
,Pipe.SinkChannel
,SocketChannel
一个可以从一系列缓冲区中写入字节的通道。
一个聚集写操作在单个调用中从给定的一系列缓冲区中的一个或多个中写入字节序列。聚集写通常在实现网络协议或文件格式时非常有用,例如,将数据分组为一个或多个固定长度头部后跟可变长度主体的段。类似的分散读操作在ScatteringByteChannel
接口中定义。
- 自 JDK 版本:
- 1.4
-
Method Summary
Modifier and TypeMethodDescriptionlong
write
(ByteBuffer[] srcs) 从给定的缓冲区向此通道写入字节序列。long
write
(ByteBuffer[] srcs, int offset, int length) 从给定缓冲区的子序列向此通道写入字节序列。Methods declared in interface java.nio.channels.WritableByteChannel
write
-
Method Details
-
write
从给定缓冲区的子序列向此通道写入字节序列。尝试将最多 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
- 如果offset
和length
参数上的先决条件不成立 -
NonWritableChannelException
- 如果此通道未打开以进行写入 -
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写操作进行中关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他 I/O 错误
-
write
从给定的缓冲区向此通道写入字节序列。形式为
c.write(srcs)
的此方法调用的行为与调用c.write(srcs, 0, srcs.length);
- 参数:
-
srcs
- 要检索字节的缓冲区 - 返回:
- 写入的字节数,可能为零
- 抛出:
-
NonWritableChannelException
- 如果此通道未打开以进行写入 -
ClosedChannelException
- 如果此通道已关闭 -
AsynchronousCloseException
- 如果另一个线程在写操作进行中关闭此通道 -
ClosedByInterruptException
- 如果另一个线程在写操作进行中中断当前线程,从而关闭通道并设置当前线程的中断状态 -
IOException
- 如果发生其他 I/O 错误
-