在基本IO操作中所有操作都是直接已流的形式完成的,而在NIO中所有的操作都要使用缓存区处理,且所有的读写操作都是通过缓存区完成的。缓存区(Buffer)是一个线性的、有序的数据集,只能容纳某种特定的数据类型
Buffer的基本操作
java.nio.Buffer是一个抽象类,常见方法如下
public final int capacity() | 返回此缓存区的容量 |
public final int limit() | 返回此缓存区的限制 |
public final Buffer limit(int newLimit) | 设置此缓存区的限制 |
public final int position() | 返回缓存区的操作位置 |
public final Buffer flip() | 重设缓存区,在写入之前调用,改变缓冲的指针 |
public final boolean hasRemaining() | 判断当前位置和限制之间是否有内容 |
各种数据类型的缓冲区类
java.nio.ByteBuffer | 存储字节的Buffer |
java.nio.IntBuffer | 储存整形的Buffer |
更多参考api
演示缓冲区的操作
import java.nio.IntBuffer;
public class IntBufferDemo01 {
/**
* @param args
*/
public static void main(String[] args) {
IntBuffer buf = IntBuffer.allocate(10);
System.out.println("1、写入数据之前的position、limit和capacity");
System.out.println(buf.position()+","+buf.limit()+","+buf.capacity());
int[] temp ={1,3,5};
buf.put(2);
buf.put(temp);
System.out.println("2、写入数据之后的position、limit和capacity");
System.out.println(buf.position()+","+buf.limit()+","+buf.capacity());
buf.flip(); //重设缓冲区 limit设置为position,position设置为0
System.out.println("3、准备输出数据时的position、limit和capacity");
System.out.println(buf.position()+","+buf.limit()+","+buf.capacity());
System.out.println("缓冲区的内容:");
while(buf.hasRemaining()){
int x = buf.get();
System.out.print(x+"、");
}
}
}
输出:
1、写入数据之前的position、limit和capacity 0,10,10 2、写入数据之后的position、limit和capacity 4,10,10 3、准备输出数据时的position、limit和capacity 0,4,10 缓冲区的内容: 2、1、3、5、
创建子缓冲区
可以使用各个缓冲区的类的slice()方法从一个缓冲区中创建一个新的子缓冲区,子缓冲区与原缓冲区中的各个部分数据可以共享
import java.nio.IntBuffer;
public class IntBufferDemo02 {
/**
* @param args
*/
public static void main(String[] args) {
IntBuffer buf = IntBuffer.allocate(10);
IntBuffer sub = null;
for (int i = 0; i < 10; i++) {
buf.put(2*i+1);
}
buf.position(2);
buf.limit(6);
sub = buf.slice();
for (int i = 0; i < sub.capacity(); i++) {
int temp = sub.get(i);
sub.put(temp-1);
}
buf.flip();
buf.limit(buf.capacity());
System.out.println("主缓存区中的内容");
while(buf.hasRemaining()){
int x = buf.get();
System.out.print(x+"、");
}
}
}
输出:
主缓存区中的内容 1、3、4、6、8、10、13、15、17、19、
创建直接缓冲区
在缓冲区操作类中,只有ByteBuffer可以创建直接缓冲区,使用直接缓冲区的时候,JVM虚拟机会直接在此缓冲区上执行 本机IO操作,也就是说,在每次调用基础操作系统的一个本机IO之前或者之后,虚拟机都会避免将缓冲区的内容复制到中间缓冲区(或者从中间缓冲区复制内容)。
创建直接缓冲区方法如下:
public static ByteBuffer allocateDirect(int capacity)
import java.nio.ByteBuffer;
public class ByteBufferDemo01 {
/**
* @param args
*/
public static void main(String[] args) {
ByteBuffer buf = null;
buf = ByteBuffer.allocate(10);
byte[] temp ={1,3,5,7,9};
buf.put(temp);
buf.flip();
System.out.println("缓冲区的内容:");
while(buf.hasRemaining()){
int x = buf.get();
System.out.print(x+"、");
}
}
}
输出:
缓冲区的内容: 1、3、5、7、9、