参考链接:http://www.cnblogs.com/zhanglei93/p/6653923.html
NIO简单来讲就是nonblock IO,非阻塞IO,核心是一个接口和两个抽象类,Channel接口、Selector抽象类、Buffer抽象类,都在java.nio包中。
一.Channel
代表与一个实体的连接通道,常用的实体是文件和网络socket。Channel及其实现类是线程安全的。
Channel接口就两个方法,boolean isOpen(); 及 void close();
常用的子接口是ByteChannel和NetworkChannel,前者是跟文件处理相关的,后者是跟网络连接有关的。
1.ByteChannel接口
常用的实现类是java.nio.channels.FileChannel,用于文件处理。FileChannel也是抽象类,不能直接实例化,只能通过调用FileInputStream对象、FileOutputStream对象或者RandomAccessFile对象的getChannel()方法生成。FileInputStream对象生成的FileChannel对象还是用于输入,FileOutputStream对象生成的FileChannel对象还是用于输出。
FileChannel常用的方法如下:
int read(ByteBuffer dst); 需要传一个ByteBuffer对象,意思是从调用者FileChannel对象中读取字节到指定的ByteBuffer对象中。
int write(ByteBuffer src); 也是需要传一个ByteBuffer对象,意思是把指定ByteBuffer对象中的字节写到调用者FileChannel对象中。注意FileChannel虽然在java.nio包中,但却不是nio的,因为write()方法执行的时候回阻塞线程的。
long transferTo(long position, long count, WritableByteChannel target); 意思是把调用者FileChannel对象的从position位置开始的、count个字节传输到指定的可写的ByteChannel对象中去,返回实际传输的字节数。
long transferFrom(ReadableByteChannel src, long position, long count); 意思是把给定的可读的ByteChannel对象的从position位置开始的、count个字节传输到调用者FileChannel对象去,返回实际传输的字节数。
MappedByteBuffer map(MapMode mode, long position, long size); 意思是把调用者FileChannel对应的文件按某种模式映射到内存中,得到一个ByteBuffer对象。模式有3种,分别是仅读、读写和私有。
2.NetworkChannel接口
下面再讲。
二.Buffer
是某种原始类型数据的容器。这里的原始类型就是java中除布尔类型外的7种原始类型,所以Buffer对应有7个子类,最常用的两个子类是ByteBuffer、charBuffer。
Buffer中有三个重要的概念:capacity(容量)、limit(界限)、position(位置):
capacity,缓冲区的容量表示该Buffer的最大数据容量,即最多可以存储多少数据,Buffer对象创建后,capacity不能改变。例如:ByteBuffer bbuff=ByteBuffer.allocate(8);