一、Buffer 的种类
Java NIO 有以下Buffer类型
- ByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
二、Buffer 属性capacity,position和limit
position和limit的含义取决于Buffer处在读模式还是写模式。不管Buffer处在什么模式,capacity的含义总是一样的。
三、Buffer创建
ByteBuffer的例子。
1 | ByteBuffer buf = ByteBuffer.allocate( 48 ); |
这是分配一个可存储1024个字符的CharBuffer:
1 | CharBuffer buf = CharBuffer.allocate( 1024 ); |
四、Buffer 的方法
4-1 写数据
写数据到Buffer有两种方式:
- 从Channel写到Buffer。
- 通过Buffer的put()方法写到Buffer里。
从Channel写到Buffer的例子
int
bytesRead = inChannel.read(buf);
//read into buffer.
通过put方法写Buffer的例子:
buf.put(
127
);
4-2
flip()方法
flip方法将Buffer从写模式切换到读模式。调用flip()方法会将position设回0,并将limit设置成之前position的值。
换句话说,position现在用于标记读的位置,limit表示之前写进了多少个byte、char等 —— 现在能读取多少个byte、char等。
4-3 读数据
- 从Buffer读取数据到Channel。
- 使用get()方法从Buffer中读取数据。
从Buffer读取数据到Channel的例子:
int
bytesWritten = inChannel.write(buf);
使用get()方法从Buffer中读取数据的例子
byte
aByte = buf.get();
4-4
clear()与compact()方法
clear() : position将被设回0,limit被设置成 capacity的值。再无法得到未读取的数据;
compact() : 将所有未读的数据拷贝到Buffer起始处。然后将position设到最后一个未读元素正后面。limit属性依然像clear()方法一样,设置成capacity。现在Buffer准备好写数据了,但是不会覆盖未读的数据。还可以得到未读取的数据。
4-5 mark()与reset()方法
通过调用Buffer.mark()方法,可以标记Buffer中的一个特定position。之后可以通过调用Buffer.reset()方法恢复到这个
4-6 案例:
public class BufferTest {
public static void main(String[] args) {
//创建指定长度的缓冲区
IntBuffer buff = IntBuffer.allocate(10);
int[] array = new int []{3, 5, 1};
//使用数组来创建一个缓冲区视图
buff = buff.wrap(array);
System.out.println("\n原缓冲区数据:");
for ( int i = 0 ; i < buff.limit(); i++ ) {
System.out.print(buff.get() + "\t");
}
//对缓冲区某个位置上面进行元素修改
buff.put(0,7);
System.out.println("\n修改后缓冲区数据:");
for ( int i = 0 ; i < buff.limit(); i++ ) {
System.out.print(buff.get(i) + "\t");
}
System.out.println("\n修改后数组数据:");
for ( int i = 0 ; i < array.length; i++ ) {
System.out.print(array[i] + "\t");
}
//buff.flip(); //对缓冲区进行反转
//buff.clear();
System.out.println("\n Buffer 信息 :" + buff);
// 复制一个新的缓冲区
IntBuffer buff2 = buff.duplicate();
System.out.println("\n 新buff2 信息 : " + buff2);
buff2.flip();
for (int i = 0 ; i < buff2.limit() ; i++){
System.out.print(buff2.get() + "\t");
}
}
}