2012-03-28 105 views
2

我不明白,这是什么缓冲类的用途。他们不是为了缓冲吗?我认为这应该意味着一个缓冲区对象应该允许同时读取和独立写入。然而事实并非如此:缓冲区只允许一个position,一个用于读写。这意味着如果我用相对的put()写入了缓冲区,那么我就无法读取任何对相关的东西敏感的东西get()。另外,如果我可以互换地拨打put()get(),我会得到一个deli妄。Java NIO缓冲区类的主要用途是什么?

那么缓冲区是否有任何使用模式(样本)?所以很明显这些缓冲区比传统的阵列好一些?

+1

我同意。在我看来,这种设计在没有单独的读写指针时存在严重缺陷。他们提供的'flip()'操作的丑陋名字反而让游戏变得不那么容易。如果它与现实世界中的某些事物相对应,那么它会有一个更好的名字。取而代之的是,它完全是一个API工件,具有同样虚假的名称。 – EJP 2012-03-28 22:53:58

回答

2

ByteBuffer用于读取和写入数据,您可以获取/放置许多原始类型并控制顶点。它们可以作为直接内存(堆外)和内存映射文件(也是堆外)的包装器

它们可以用于性能(因为它们可以在没有组装字节的情况下以本地方式访问长整型或双整型),直接字节缓冲区可以在没有额外拷贝的情况下读取/写入数据到“Java”内存中。内存映射文件可以扩展到磁盘空间的大小,从而可以在不影响GC时间的情况下使用大量内存。

+0

是否可以使用两个“ByteBuffers”共享相同的数组或内存区域?这将允许使用一个读取和另一个写入? – 2012-03-28 20:22:45

+0

我正是在线程和进程之间传递数据的。即共享存储器。 – 2012-03-28 20:25:09

+1

最简单的方法是创建一个ByteBuffer和splice(0,然后你有两个ByteBuffers使用相同的底层缓冲区 – 2012-03-28 20:26:19