Akl*_*lin 184 java buffer bytebuffer
ByteBufferJava 中的示例应用程序是什么?请列出使用此方法的任何示例方案.谢谢!
yko*_*tor 92
ByteBuffer类很重要,因为它构成了在Java中使用通道的基础.ByteBuffer类在字节缓冲区上定义了六类操作,如Java 7文档中所述:
Example code : Putting Bytes into a buffer.
// Create an empty ByteBuffer with a 10 byte capacity
ByteBuffer bbuf = ByteBuffer.allocate(10);
// Get the buffer's capacity
int capacity = bbuf.capacity(); // 10
// Use the absolute put(int, byte).
// This method does not affect the position.
bbuf.put(0, (byte)0xFF); // position=0
// Set the position
bbuf.position(5);
// Use the relative put(byte)
bbuf.put((byte)0xFF);
// Get the new position
int pos = bbuf.position(); // 6
// Get remaining byte count
int rem = bbuf.remaining(); // 4
// Set the limit
bbuf.limit(7); // remaining=1
// This convenience method sets the position to 0
bbuf.rewind(); // remaining=7
Run Code Online (Sandbox Code Playgroud)
dee*_*ain 20
使用面向流的API的Java IO使用缓冲区作为用户空间内的数据的临时存储来执行.通过DMA从磁盘读取的数据首先被复制到内核空间中的缓冲区,然后传输到用户空间中的缓冲区.因此有开销.避免它可以获得相当大的性能提升.
如果有直接访问内核空间中的缓冲区的方法,我们可以跳过用户空间中的这个临时缓冲区.Java NIO提供了一种方法.
ByteBuffer是Java NIO提供的几个缓冲区之一.它只是一个容器或储存罐,用于从中读取数据或将数据写入.通过allocateDirect()在Buffer上使用API 分配直接缓冲区来实现上述行为.
Dhe*_*uru 13
这是一篇很好的文章,解释了ByteBuffer的好处.以下是本文的重点:
以下是直接ByteBuffer/MappedByteBuffer的优点.请注意,直接缓冲区是在堆外部创建的:
不受gc周期的影响:直接缓冲区在垃圾收集周期中不会移动,因为它们位于堆外.TerraCota的BigMemory缓存技术似乎在很大程度上依赖于这一优势.如果它们在堆上,它会减慢gc暂停时间.
性能提升:在流IO中,读取调用将需要系统调用,这需要在用户到内核模式之间进行上下文切换,反之亦然,这将是昂贵的,尤其是在不断访问文件的情况下.但是,通过内存映射,这种上下文切换会减少,因为数据更有可能在内存中找到(MappedByteBuffer).如果数据在内存中可用,则无需调用OS即可直接访问,即无上下文切换.
请注意,MappedByteBuffers非常有用,特别是如果文件很大并且更频繁地访问几组块.