为什么用NIO
优点:NIO以块的方式处理数据,NIO是以流(字节)方式处理。NIO将最耗时的IO操作(即填充和提取缓冲区)转移回操作统。
缺点:面向块的I/O缺少一些面向流的I/O所具有的优雅性和简单性
补充:JDK1.4以后,java.io.*已经以NIO为基础重新实现了,处理也会很快。
缓冲区Buffer
任何时候访问NIO中的数据,都是通过缓冲区来操作。本质是一个数组,提供了数据的结构化访问,
还可以跟踪系统的读写进程。
最简单的是ByteBuffer。还有其他基于Java基本类型的Buffer。例如 CharBuffer,IntBuffer...
Buffer有三个属性:
position 变量跟踪已经写了多少数据。更准确地说,它指定了下一个字节将放到数组的哪一个元素中
limit 变量表明还有多少数据需要取出(在从缓冲区写入通道时),或者还有多少空间可以放入数据(在从通道读入缓冲区时)
capacity 表明可以储存在缓冲区中的最大数据容量。实际上,它指定了底层数组的大小 — 或者至少是指定了准许我们使用的底层数组的容量
flip() ,clear()等操作都是对这些变量的改变,改变缓冲区的属性
通道Channel
通过通道,可以读取和写入数据。等价于原I/O的流。通道是连接缓冲区的纽带,对数据的操作是通过通道来处理的,通道直接操作缓冲区。
通道是双向的,这点跟流不同。
“从一个通道中读取很简单:只需创建一个缓冲区,然后让通道将数据读到这个缓冲区中。写入也相当简单:创建一个缓冲区,用数据填充它,然后让通道用这些数据来执行写入操作”
总结
NIO的精髓就是Buffer 和 Channel,明白了它们的原来细节,接下来就是熟悉API,熟练应用到你的项目中去了。在这里推荐一个很好的NIO入门材料(IBM开发社区的NIO入门),希望对您学习NIO有帮助