【发布时间】:2018-01-25 23:38:25
【问题描述】:
我是 Java ByteBuffers 的新手,想知道在翻转后写入 ByteBuffer 的正确方法是什么。
在我的用例中,我正在将 outputBuffer 写入套接字:
outBuffer.flip();
//Non-blocking SocketChannel
int bytesWritten = getSocket().write(outBuffer);
在此之后,必须再次写入输出缓冲区。此外,并非 outBuffer 中的所有字节都已写入套接字。
既然它目前是翻转的,我怎样才能让它再次可写,如果它仍然在缓冲区中并且没有被写入套接字,我怎样才能让它再次可写,而不覆盖任何数据?
如果我是对的,outBuffer.position() == bytesWritten 和 limit 应该是要写入的数据量。
那么使用以下内容来重用输出缓冲区是否正确? :
int limit = outBuffer.limit()
outBuffer.limit(outBuffer.capacity());
outBuffer.position(limit);
【问题讨论】:
-
是否要在重用之前写入(翻转的)缓冲区的全部内容?
-
这是个好问题。我认为
getSocket().write()会在当前时间尽可能多地写入,并且不知道是否值得轮询以写入整个缓冲区。对于这个例子,我只是在套接字允许的范围内写入(bytesWritten),然后想在此之后继续放入缓冲区,而不覆盖任何未写入套接字的数据。