Java NIO ByteBuffer,翻转后写

时间:2018-01-25 23:38:26

标签: java byte buffer nio

我是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);

2 个答案:

答案 0 :(得分:3)

来自API规范的

再次以下循环通过缓冲区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引用的循环。