Java NIO中的Buffer及其子类用来跟Channel以及子类交互。如你所了解的,数据通过通道写入缓冲区,或者从缓冲区读取。
一个Buffer基本上就是一块你可以读写数据的内存。这块内存被包装成了Buffer对象,并且提供了一系列方法帮助你更好的操作这块内存。
Buffer的基本用法
使用Buffer读取数据通常分为如下4步:
- 将数据写入Buffer
- 调用buffer.flip()
- 从缓冲区读取数据
- 调用buffer.clear()或buffer.compact()
当你想Buffer中写入数据时,这块buffer会记录你写入了多少数据。当你需要读取数据的时候,你需要调用flip()方法将buffer从写模式切换到读模式。在写模式下,你可以读取你写入的所有数据。
当你读取完数据,你需要清空buffer,准备再次写入数据。你可以通过调用flip()或者compact(0方法来达到此目的。clear()方法用于清空整个缓冲区。compact()仅清空你已经读取的数据,所有未读的数据会被移动到缓冲区的开头,再次写入会被追加到这些未读数据的后面。
下面是使用Buffer的一个简单示例
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
/**
* Created by zk on 2014/12/26.
*/
public class FileChannelDemo {
public static void main(String[] args) {
try {
RandomAccessFile aFile = new RandomAccessFile("G:\\test.txt", "rw");
//IO <-> NIO
FileChannel inChannel = aFile.getChannel();
ByteBuffer buf = ByteBuffer.allocate(48);
int bytesRead = inChannel.read(buf);
while (bytesRead != -1) {
System.out.println("[--Read--" + bytesRead + "]");
buf.flip();
//如果缓冲区中还有未读完的数据
while (buf.hasRemaining()) {
System.out.print((char) buf.get());
}
buf.clear();
bytesRead = inChannel.read(buf);
}
aFile.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
Buffer Capacity,Position and Limit
- capacity
- position
- limit
Capacity
分配一片内存区域,其对应的Buffer总有固定的大小,也被称为Capacity。你可以往这片内存区域写入Capacity大小的bytes,longs,chars等等不同类型的数据。一旦缓冲区满,你必须置空这块缓冲区(read()或者clear())才能再次写入数据。
Position
Limit
Buffer类型
Java NIO包含以下几种Buffer类型:
- ByteBuffer
- MappedByteBuffer
- CharBuffer
- DoubleBuffer
- FloatBuffer
- IntBuffer
- LongBuffer
- ShortBuffer
如你所看到的,这些类型代表了不同的数据类型。或者说,这允许你使用char,short,int,long,float或者double来代替byte处理缓冲区数据。
MappedByteBuffer有一点不同,我们将单独说明。
分配一个缓冲区
向缓冲区写入数据
flip()
从缓冲区读取数据
rewind()
clear() 和 compact()
mark() 和 reset()
equals() 和 compareTo()
equals()
- They are of the same type
- They have the same amount of remaining bytes,chars etc. int the buffer
- All remaining bytes,chars etc. are equal.
compareTo()
- The first element which is equal to the corresponding element int the other buffer, is smaller than that int the other buffer.
- All elements are equal, but the first buffer runs out of elements before the second buffer does(it has fewer elements)