1.简介
Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API。NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,NIO支持面向缓冲区的、基于通道的IO操作。NIO将以更加高效的方式进行文件的读写操作。
1.1.IO和NIO的区别:
IO | NIO |
面向流(Stream Oriented) | 面向缓冲区(Buffer Oriented) |
阻塞IO(Blocking IO) | 非阻塞IO(NonBlocking IO) |
1.1.1 面向流和面向缓冲区:
传统的IO再进行数据传输的时候,会根据输入和输出的不同分别建立不同的链接,传输的数据会转化成数据流的形式在链接中传输,就像自来水流在自来水管中传输,电流在电线中传输一样。
面向缓冲区的NIO在传输数据的时候,会在输入和输出之间建立通道,然后将数据放入缓冲区,缓冲区通过通道在输入和输出之间传输。这时候的传输模型就像快递一样,我们只需要把快递放到快递投递点,如何传输就只需要交给快递员传输就可以了。
2.通道与缓冲区
在JAVA NIO中的通道和缓冲区是什么?
通道表示程序跟IO设备之间的链接,缓冲区分为直接与非直接缓冲区,直接缓冲区是在操作系统内存中开辟的一片区域(详情见JVM内存管理的直接内存);二、非直接缓冲区是JVM分配的一块内存。
非直接缓冲区:通过allocate()方法获取的缓冲区都是非直接缓冲区。这些缓冲区是建立在JVM堆内存之中的。
public static ByteBuffer allocate(int capacity) {
if (capacity < 0)
throw new IllegalArgumentException();
// 在堆内存中开辟空间
return new HeapByteBuffer(capacity, capacity);
}
HeapByteBuffer(int cap, int lim) { // package-private
// new byte[cap] 创建数组,在堆内存中开辟空间
super(-1, 0, lim, cap, new byte[cap], 0);
/*
hb = new byte[cap];
offset = 0;
*/
}