Java 1.4中在java.nio包中增加了Buffer类以及一些处理基本数据类型的子类(除了boolean型) ,用来提供为基本数据类型(primitive) 的数据提供一个容器。
何谓Buffer? 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。 万不得已, 需要为读写操作加锁。