*概述

---通过FileChannel的map(),可以使用directbuffer的方式读写文件内容,这里称之为内存映射.

Open Declaration MappedByteBuffer java.nio.channels.FileChannel.map(MapMode mode, long position, long size) throws IOException

*MappedByteBuffer

---优点

没有系统调用,节省了时间,这是使用directbuffer的好处,没有JVM和系统之间的复制操作.

---特殊的buffer,对应文件内容在虚拟内存中的一个区域,是direct buffer.所以创建需要的代价更大,适用于对大文件操作的情况.

---map()调用时的参数MapMode,它是FileChannel的静态内部类,定义对bufffer内容的执行方式

MapMode.READ_ONLY,只能对buffer进行读操作,否则抛出异常,NonWritableChannelException.

MapMode.READ_WRITE,可读可写,修改会写入文件.

MapMode.PRIVATE,可读可写,但是修改的内容不会写入文件,只是buffer自身的改变,称之为”copy on write”.

“copy on write”的好处,同一文件的多个buffer,可以共享同一片内存页.

注意,同一文件的MapMode.READ_ONLY和MapMode.READ_WRITE是公用同一个数组,但是MapMode.PRIVATE却是各自独立的.

*MappedByteBuffer的API

---load()

将buffer的内容,加载到物理内存中,目的是为了更快的操作.

但是这个方法受到很多因素的影响,如文件系统,JVM,系统内存等,总之慎用.

---force()

将buffer修改的内容,全部写入文件.只对MapMode.READ_WRITE有效

*示例一

---from java nio,说明了同一个文件的各种模式的MappedByteBuffer之间的关系

MappedByteBuffer示例

*示例二

---说明同一文件的MapMode.PRIVATE的buffer之间是互补影响的,且force()是无效的

MappedByteBuffer示例2

posted on 2011-03-27 14:50  戴忠  阅读(3617)  评论(0编辑  收藏  举报