一些学习笔记:
首先, Buffer
是一个线性的有限长度的特定基本数据的序列。 除了基础数据外,它还包括一些基础操作和属性, 比如capacity
, limit
和 position
。
实际使用中使用特定的子类来处理数据。每个子类都定义了两套get/put的操作。
- 相对位置操作 (Relative )。 从当前位置
position
读写一个或者多个元素, 并position
增加相应的数值。 如果一个get请求的数据超过了limit
的位置,会抛出BufferUnderflowException
异常。 如果一个put操作超过了limit
的限制, 会抛出BufferOverflowException
异常。不管上面哪种情况,没有数据被传输。 - 绝对位置操作 (Absolute )。 显式地提供index, 不会影响
position
的值。 如果索引超过limit
会抛出IndexOutOfBoundsException
异常。
数据也可以通过Channel
的I/O操作如write
,read
写入或者读出。
显然, Buffer只有写入了数据才可能有意义的数据读出。
Buffer类并不是线程安全的, 使用时要特别小心, 避免多线程同时读写同一个Buffer。 万不得已, 需要为读写操作加锁。
概念反正也记不住,直接上代码:cache和buffer的区别
从应用场景上看:Buffer
更多的(场景)是减小写操作的冲击,而Cache
主要用于减小读 I/O 的重复开销。
- allocate()或者allocateDirect()
|
|
- 包装一个数组
|
|
- 内存映射,即调用FileChannel的map()方法
|
|
在openGL的运用中,为了提高性能,通常将位置坐标的数组存放到java.io 中定义的Buffer类中:
- // a float is 4 bytes, therefore we multiply the number if
- // vertices with 4.
- ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
- vbb.order(ByteOrder.nativeOrder());
- vertexBuffer = vbb.asFloatBuffer();
- vertexBuffer.put(vertices);
- vertexBuffer.position(0);
Ps:内存映射文件是一种允许Java程序直接从内存访问的特殊文件。通过将整个文件或者文件的一部分映射到内存中、操作系统负责获取页面请求和写入文件,应用程序就只需要处理内存数据,这样可以实现非常快速的IO操作。用于内存映射文件的内存在Java的堆空间以外。