我是Java ByteBuffers的新手,想知道在翻转ByteBuffer之后写入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);
答案 0 :(得分:3)
再次: 以下循环通过缓冲区buf将字节从一个通道复制到另一个通道:
_data = df.iplot(kind='scatter', mode='lines+markers',
x='Time', y='Events',
title='Events over Time', asFigure=True)
_data['layout']['yaxis'] = dict(side='left')
_data.iplot()
答案 1 :(得分:2)
因为它目前正在翻转
它将保持翻转状态。写不会改变它。
如果它仍然在缓冲区中并且未写入套接字,如何在不覆盖任何数据的情况下再次使其可写?
你不必做任何事情,但如果你想在再次写作之前阅读,你应该翻转/写/压缩。如果您只想重复写入,请再次调用write()
,缓冲区仍处于当前状态。
但我更喜欢始终为读取保留这些缓冲区,因此不存在滑动,翻转/写入/压缩(或翻转/获取/压缩)的可能性操作是必要的,原封不动的。
请注意,不使用clear()
,除非您确定写入已完成并且缓冲区现在为空。在这种情况下,紧凑和清晰是等价的。但是总是紧凑就更简单了。
如果您要以阻止模式进行复制,请使用@zlakad引用的循环。