在与NIO通道交互时使用Java NIO Buffer。 如您所知,数据从通道读入缓冲区,并从缓冲区写入通道。dom
缓冲区本质上是一个能够写入数据的内存块,而后能够再次读取。 此内存块包含在NIO Buffer对象中,该对象提供了一组方法,能够更轻松地使用内存块。spa
使用缓冲区读取和写入数据一般遵循这4个小步骤:code
写入数据到缓冲区对象
调用 buffer.flip()ip
从缓冲区读取数据内存
调用 buffer.clear() 或者 buffer.compact()ci
当你将数据写入Buffer时,Buffer会跟踪你已经写入了多少数据。一旦你须要读出数据,你须要调用 flip() 方法将Buffer从写模式转换到读模式。在读模式,Buffer容许你将以前写入的数据所有读出。get
一旦你已经读出了全部数据,你须要清除Buffer,为下次写入数据作准备。能够经过如下两种方法来完成:clear() 和 compact()。clear() 方法清除整个Buffer,而 compact() 方法仅仅清除你已经读出的Buffer,未读数据会被移动到Buffer的开始位置,再次写入的数据会追加到未读数据的后面。it
这是一个简单的 Buffer 使用的例子,使用的 write, flip, read 和 clear 操做:io
RandomAccessFile aFile = new RandomAccessFile("data/nio-data.txt", "rw"); FileChannel inChannel = aFile.getChannel(); //create buffer with capacity of 48 bytes ByteBuffer buf = ByteBuffer.allocate(48);int bytesRead = inChannel.read(buf); //read into buffer. while (bytesRead != -1) { buf.flip(); //make buffer ready for read while(buf.hasRemaining()){ System.out.print((char) buf.get()); // read 1 byte at a time } buf.clear(); //make buffer ready for writing bytesRead = inChannel.read(buf); } aFile.close();
Buffer的三个属性:容量,位置和限定符