Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ByteBuffer,什么是检测是否需要翻转的干净方法_Java_Bytebuffer - Fatal编程技术网

Java ByteBuffer,什么是检测是否需要翻转的干净方法

Java ByteBuffer,什么是检测是否需要翻转的干净方法,java,bytebuffer,Java,Bytebuffer,是否有一种干净可靠的方法来检测是否需要翻转副缓冲器 我有一个ByteBuffer,用于打包和解包数据结构,也用于存储要打包/解包的字节 但是,如果刚刚执行了写入操作或读取操作,或者如果向我的代码传递了ByteBuffer,我无法保证缓冲区在没有手动操作位置和限制的情况下处于写入模式或读取模式 部分读取和写入也会增加此问题。我一直采用这样一种约定,即缓冲区保持在写模式,并创建一个副本并翻转以用于读取目的。当一个缓冲区被传递到我的代码中时,它被手动检查,并且位置和限制被设置为写模式。当然有更好的方法

是否有一种干净可靠的方法来检测是否需要翻转副缓冲器

我有一个ByteBuffer,用于打包和解包数据结构,也用于存储要打包/解包的字节

但是,如果刚刚执行了写入操作或读取操作,或者如果向我的代码传递了ByteBuffer,我无法保证缓冲区在没有手动操作位置和限制的情况下处于写入模式或读取模式


部分读取和写入也会增加此问题。我一直采用这样一种约定,即缓冲区保持在写模式,并创建一个副本并翻转以用于读取目的。当一个缓冲区被传递到我的代码中时,它被手动检查,并且位置和限制被设置为写模式。当然有更好的方法。

将其封装在对象中,如下所示:

class FlippingByteBuffer {
  ByteBuffer buffer;
  boolean isInUse;
  boolean/Enum mode; //Is it read or write?
}
然后您可以在代码中使用它:

//I'm about to read
FlippingByteBuffer fbb =...;
fbb.beginReading();
doSomething(fbb.getByteBuffer());
fbb.finishReading();
这样你就知道什么时候发生了什么。您甚至可以开始使用
Lock
s来确保读写过程相互阻塞等


如果中间有东西,(你在调用某个东西,它正在调用你),你可以把你的<代码> FlippingByteBuffer <代码>放到一个地图上,或者把它放在<代码> thRead本地< /Cube >(EWWW!),或者让<代码> FlippingByteBuffer <代码>实现<代码> ByteBuffer < /代码>。根据您的操作,它可能能够自动在模式之间切换(使用读写方法)。

作为一个想法,将ByteBuffer包装到另一个类中如何?无论何时执行读或写操作,该类都可以更新和维护所需的状态。您可能还希望实现锁定或其他机制以使其线程安全。

我认为它不是ByteBuffer的一部分的原因是因为“读取”和“写入”模式的概念是ByteBuffer概念的一部分。缓冲区可以在任何时候读取或写入,因此不严格存在于读/写状态

一旦我意识到这一点,我们就有责任实现自己的读/写状态跟踪


这是一个非常常见的用例,nio应该实现它。。。尤其是因为ByteBuffer接口是不可扩展的。

Java怎么能不在API中提供这种封装,这似乎是一个重要的特性。。。如果在“if”块中碰巧使用了flip(),那么没有它,您永远无法确定自己处于读模式还是写模式。