在Java中使用ByteBuffer处理交错读写的最佳方法是什么?

问题描述 投票:0回答:1

编辑:为了让问题不那么 "观点化

我想请教一下,在交错读写的情况下,使用字节缓冲区的建议性方法。

我的程序处理了一个随机序列的NIO,该NIO执行了 read()write() 运作到 ByteBuffer. 目前,我使用一个变量来记录最后的操作是否是 read()write()呼叫 flip()compact() 相应的。

这是最好的方法还是ByteBuffer不是用来处理这个任务的?


原问题标题 Java ByteBuffer设计得不好吗?

我刚刚开始使用Java NIO,我认为Bytebuffer的设计方式使得 夹层 读写操作难以实现。凡是这样的操作模式正是我们在NIO中设置 "缓冲区 "的原因。

具体来说,就是 flip()compact() 是编程中不必要的细节。如果我有一个随机序列的 read()write() 到一个字节缓冲区,那么我别无选择,只能保留一个单独的变量来跟踪缓冲区是否被 "翻转"。例如,对于一个被翻转的缓冲区,我需要用 compact() 其前 write 但我不能对一个未翻转的缓冲区进行这样的操作。

我认为,几乎没有任何情况下,一个 write() 下面 read() 不用打电话 compact()clear() 先是。另外,没有 read() 之后 write() 是没有 flip()所以,我认为两者都应该做。

  • 让 "读模式 "和 "写模式 "显式化,如果在读模式下写,则发出警告,反之亦然。使用一个显式的 readMode()writeMode() 命令来切换。
  • 通过采用不同的设计(如循环缓冲区)或在读写时隐含它来消除在读写前进行flipcompact的需要。

由于我对Java还很陌生,我想知道我的抱怨是合法的,还是在实现Bytebuffer时有一些精心的设计选择?

java buffer nio nonblocking
1个回答
0
投票

非常感谢用户207421的回答。他提出了一个很好的解决方案,我现在在设计中也采用了。

基本上,你总是保持 ByteBuffer 在每次操作后都处于相同的状态。

例如,为了保持 ByteBuffer 处于非翻转状态,那么每 write() 操作时应使用 flip()compact() 前后。另外,增加同步处理线程。

© www.soinside.com 2019 - 2024. All rights reserved.