Java NIO ByteBuffer,翻转后写入
Java NIO ByteBuffer, write after flip
我是 Java ByteBuffers 的新手,想知道翻转后写入 ByteBuffer 的正确方法是什么。
在我的用例中,我正在将 outputBuffer 写入套接字:
outBuffer.flip();
//Non-blocking SocketChannel
int bytesWritten = getSocket().write(outBuffer);
在此之后,必须再次写入输出缓冲区。也并非 outBuffer 中的所有字节都已写入套接字。
由于它当前已翻转,如果它仍在缓冲区中且未写入套接字,我如何才能使其再次可写,而不覆盖任何数据?
如果我是对的,outBuffer.position() == bytesWritten 并且限制应该是要写入的数据量。
那么使用以下命令重用输出缓冲区是否正确? :
int limit = outBuffer.limit()
outBuffer.limit(outBuffer.capacity());
outBuffer.position(limit);
来自 API 规范:
以下循环通过缓冲区 buf 将字节从一个通道复制到另一个通道:
while (in.read(buf) >= 0 || buf.position != 0) {
buf.flip();
out.write(buf);
buf.compact(); // In case of partial write
}
since it is currently flipped
它将保持翻转状态。写入不会改变这一点。
how can I make it writable again, without overriding any data if it is still in the buffer and wasn't written to the socket?
您无需执行任何操作,但如果您想在再次写入之前先阅读,则应该执行 flip/write/compact。如果您只想重复写入,只需再次调用 write()
,缓冲区仍处于当前状态。
但我更喜欢始终为 读取 准备好这些缓冲区,因此不会出现失误,并且 flip/write/compact(或 flip/get/compact) 当这些操作是必要的时候,就像原子一样。
请注意,您应该不使用clear()
,除非您确定写入已完成且缓冲区现在为空。在那种情况下, compact 和 clear 是等价的。但是总是紧凑更简单。
如果您在阻塞模式下复制,请使用@zlakad 引用的循环。
我是 Java ByteBuffers 的新手,想知道翻转后写入 ByteBuffer 的正确方法是什么。
在我的用例中,我正在将 outputBuffer 写入套接字:
outBuffer.flip();
//Non-blocking SocketChannel
int bytesWritten = getSocket().write(outBuffer);
在此之后,必须再次写入输出缓冲区。也并非 outBuffer 中的所有字节都已写入套接字。
由于它当前已翻转,如果它仍在缓冲区中且未写入套接字,我如何才能使其再次可写,而不覆盖任何数据?
如果我是对的,outBuffer.position() == bytesWritten 并且限制应该是要写入的数据量。
那么使用以下命令重用输出缓冲区是否正确? :
int limit = outBuffer.limit()
outBuffer.limit(outBuffer.capacity());
outBuffer.position(limit);
来自 API 规范: 以下循环通过缓冲区 buf 将字节从一个通道复制到另一个通道:
while (in.read(buf) >= 0 || buf.position != 0) {
buf.flip();
out.write(buf);
buf.compact(); // In case of partial write
}
since it is currently flipped
它将保持翻转状态。写入不会改变这一点。
how can I make it writable again, without overriding any data if it is still in the buffer and wasn't written to the socket?
您无需执行任何操作,但如果您想在再次写入之前先阅读,则应该执行 flip/write/compact。如果您只想重复写入,只需再次调用 write()
,缓冲区仍处于当前状态。
但我更喜欢始终为 读取 准备好这些缓冲区,因此不会出现失误,并且 flip/write/compact(或 flip/get/compact) 当这些操作是必要的时候,就像原子一样。
请注意,您应该不使用clear()
,除非您确定写入已完成且缓冲区现在为空。在那种情况下, compact 和 clear 是等价的。但是总是紧凑更简单。
如果您在阻塞模式下复制,请使用@zlakad 引用的循环。