- 所有超级接口:
-
AsynchronousChannel
,AutoCloseable
,Channel
,Closeable
- 所有已知实现类:
-
AsynchronousSocketChannel
某些通道可能不允许在任何给定时间有多个读取或写入操作。如果一个线程在上一个读取操作完成之前调用读取方法,则会抛出一个 ReadPendingException
。类似地,如果在上一个写入操作完成之前调用写入方法,则会抛出一个 WritePendingException
。其他类型的I/O操作是否可以与读取操作同时进行取决于通道的类型。
请注意,ByteBuffer
不适合多个并发线程使用。当启动读取或写入操作时,必须注意确保在操作完成之前不要访问缓冲区。
- 自版本:
- 1.7
- 参见:
-
Method Summary
Modifier and TypeMethodDescriptionread
(ByteBuffer dst) 从此通道读取一系列字节到给定的缓冲区中。<A> void
read
(ByteBuffer dst, A attachment, CompletionHandler<Integer, ? super A> handler) 从此通道读取一系列字节到给定的缓冲区中。write
(ByteBuffer src) 从给定的缓冲区向此通道写入一系列字节。<A> void
write
(ByteBuffer src, A attachment, CompletionHandler<Integer, ? super A> handler) 从给定的缓冲区向此通道写入一系列字节。Methods declared in interface java.nio.channels.AsynchronousChannel
close
-
Method Details
-
read
从此通道读取一系列字节到给定的缓冲区中。此方法启动一个异步读取操作,将一系列字节从此通道读取到给定的缓冲区中。
handler
参数是一个完成处理程序,在读取操作完成(或失败)时调用。传递给完成处理程序的结果是读取的字节数,如果由于通道已达到流的末尾而无法读取任何字节,则为-1
。读取操作可能从通道读取最多 r 字节,其中 r 是缓冲区中剩余的字节数,即在尝试读取时的
dst.remaining()
。当 r 为 0 时,读取操作将立即完成,结果为0
,而不会启动I/O操作。假设读取长度为 n 的字节序列,其中
0
< n <= r。此字节序列将被传输到缓冲区中,以使序列中的第一个字节位于索引 p,最后一个字节位于索引 p + n -1
,其中 p 是读取执行时缓冲区的位置。完成后,缓冲区的位置将等于 p + n;其限制不会改变。缓冲区不适合多个并发线程使用,因此在操作完成之前应注意不要访问缓冲区。
此方法可以随时调用。某些通道类型可能不允许在任何给定时间有多个读取操作。如果一个线程在上一个读取操作完成之前启动读取操作,则会抛出一个
ReadPendingException
。- 类型参数:
-
A
- 附件的类型 - 参数:
-
dst
- 要传输字节的缓冲区 -
attachment
- 要附加到I/O操作的对象;可以为null
-
handler
- 完成处理程序 - 抛出:
-
IllegalArgumentException
- 如果缓冲区是只读的 -
ReadPendingException
- 如果通道不允许有多个读取操作同时进行且先前的读取操作尚未完成 -
ShutdownChannelGroupException
- 如果通道关联的group
已终止
-
read
从此通道读取一系列字节到给定的缓冲区中。此方法启动一个异步读取操作,将一系列字节从此通道读取到给定的缓冲区中。该方法的行为与
read(ByteBuffer,Object,CompletionHandler)
方法完全相同,只是不指定完成处理程序,而是返回表示挂起结果的Future
。Future
的get
方法返回读取的字节数,如果由于通道已达到流的末尾而无法读取任何字节,则为-1
。- 参数:
-
dst
- 要传输字节的缓冲区 - 返回:
- 表示操作结果的 Future
- 抛出:
-
IllegalArgumentException
- 如果缓冲区是只读的 -
ReadPendingException
- 如果通道不允许有多个读取操作同时进行且先前的读取操作尚未完成
-
write
从给定的缓冲区向此通道写入一系列字节。此方法启动一个异步写入操作,将一系列字节从给定的缓冲区写入此通道。
handler
参数是一个完成处理程序,在写入操作完成(或失败)时调用。传递给完成处理程序的结果是写入的字节数。写入操作可能向通道写入最多 r 字节,其中 r 是缓冲区中剩余的字节数,即在尝试写入时的
src.remaining()
。当 r 为 0 时,写入操作将立即完成,结果为0
,而不会启动I/O操作。假设写入长度为 n 的字节序列,其中
0
< n <= r。此字节序列将从缓冲区开始于索引 p 的位置传输,其中 p 是写入执行时缓冲区的位置;最后一个写入的字节的索引将为 p + n -1
。完成后,缓冲区的位置将等于 p + n;其限制不会改变。缓冲区不适合多个并发线程使用,因此在操作完成之前应注意不要访问缓冲区。
此方法可以随时调用。某些通道类型可能不允许在任何给定时间有多个写入操作。如果一个线程在上一个写入操作完成之前启动写入操作,则会抛出一个
WritePendingException
。- 类型参数:
-
A
- 附件的类型 - 参数:
-
src
- 要检索字节的缓冲区 -
attachment
- 要附加到I/O操作的对象;可以为null
-
handler
- 完成处理程序对象 - 抛出:
-
WritePendingException
- 如果通道不允许有多个写入操作同时进行且先前的写入操作尚未完成 -
ShutdownChannelGroupException
- 如果通道关联的group
已终止
-
write
从给定的缓冲区向此通道写入一系列字节。此方法启动一个异步写入操作,将一系列字节从给定的缓冲区写入此通道。该方法的行为与
write(ByteBuffer,Object,CompletionHandler)
方法完全相同,只是不指定完成处理程序,而是返回表示挂起结果的Future
。Future
的get
方法返回写入的字节数。- 参数:
-
src
- 要检索字节的缓冲区 - 返回:
- 表示操作结果的 Future
- 抛出:
-
WritePendingException
- 如果通道不允许有多个写入操作同时进行且先前的写入操作尚未完成
-