从JDK1.4开始,Java提供的java.nio.*包中,通过采用更接近操作系统IO的方式—通道和缓冲器,
提高了IO的速度,这里总结一二。
FileChannel与ByteBuffer
基本操作方式:
从FileInputStream/FileOutputStream的getChannel来获得对应的FileChannel,然后通过FileChannel.write(ByteBuffer)以及FileChannel.read(ByteBuffer)来进行读写。
ByteBuffer的内部结构:三个关键游标,position,limit,capacity。
flip():用于从ByteBuffer中读取,limit = 原position, position = 0
clear(): 用于写入ByteBuffer, position置零, limit = capacity。获取基本类型,asCharBuffer(), asShortBuffer(), asIntBuffer()。
视图缓冲器。- 内存映射文件:MappedByteBuffer, 创建和修改由于尺寸太大而不能放入内存的文件。
NIO和select(),IO多路复用模型
- 网络编程中利用NIO
将上述NIO应用到网络IO中,就形成了高效的网络非阻塞IO,SocketChannel和ServerSocketChannel。
最基本的体现这里的非阻塞特性的方式,是在server端采用单线程即可完成多个客户端的连接请求和数据处理,尽管这样做的效率可能要低于给每个客户端请求开一个线程的方式。
server端采用将channel注册到指定的selector中,然后通过selector监控各个注册channel的状态,这里的监控过程可能需要服务器轮询,所以这里其实也是一种同步的通信方式,只不过是非阻塞的,提高了运转的效率。
这里相当于是一种IO多路复用模型,和操作系统中的多路IO复用系统调用方式select很像。
参考资料:《Java网络编程》
《Java编程思想》