Java NIO 小结

来源:互联网 发布:linux中echo 编辑:程序博客网 时间:2024/06/06 21:16
http://hi.baidu.com/boywell/blog/item/2bde80f9b967cd05d9f9fdb6.html

1, NIO 不是来替代传统IO的,传统的IO经过改写,效率也有了很大的提升;

2,NIO的两个核心概念:Buffer 抽象类 & Channel 接口;

3,Buffer及其子类不依赖于Channel对象使用,反过来,Channel对象需要使用Buffer对象

4,Buffer 翻译成“缓冲器”比“缓冲区”更好,前者暗示了Buffer除了维护一个底层的数据结构外,还拥有其他管理这个数据机构的功能(职责);

     Java NIO 为除了boolean类型外的基本类型提供了Buffer子类,如IntBuffer.最常用的是ByteBuffer。关于Buffer的内部结构值得研究,有一些APIs专门用来维护Buffer内部的数据结构,见Java docs.

5,Buffer可以分为直接buffer和间接buffer。

     JVM有自己的专属内存区域,OS也有自己的系统区域,通常JVM从外存读取一个数据,需要从OS的系统区拷贝到自己的内存区域,这是间接buffer。直接Buffer就是JVM让OS直接操作自己的内存区,不用在copy了,这样IO性能就上去了,但是如果不是非常注重性能,就不要使用直接Buffer, 因为构建一个直接Buffer也需要代价的。

      ByteBuffer directByteBuffer = ByteBuffer.allocateDirect(1024); //只有ByteBuffer有此工厂方法

6,Channel 可以看成是通往某一数据源的连接,通过该连接你可以对相应的数据源进行操作。文件FileChannel 只能从FileInputStream 或者FileOutputStream中获得。

7,对比5,NIO提供了MappedByteBuffer类,该类的对象可以从Channel获得,建立起了从文件到OS内存的直接映射,只要对该对象的任何改动,就会立刻回写到磁盘文件中,由于使用的是OS的内存区而不是JVM的,加上通常情况下,JVM的读写操作最终还是要OS去执行,这就使得读写效率很高,依赖于具体的OS平台系统。

原创粉丝点击