Java的NIO

从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编程思想》

你可能感兴趣的:(java,jdk,nio)