- 1、本文档共38页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java nio 入门教程详解(二十一)
Java 2013 年 8 月 19 日 暂无评论
3.4 内存映射文件
新的FileChannel 类提供了一个名为map ()的方法,该方法可以在一个打开的文件和一个特殊类型
的ByteBuffer之间建立一个虚拟内存映射(第一章中已经归纳了什么是内存映射文件以及它们如何
同虚拟内存交互)。在 FileChannel 上调用map()方法会创建一个由磁盘文件支持的虚拟内存映射
(virtual memory mapping)并在那块虚拟内存空间外部封装一个MappedByteBuffer对象(参
见图 1-6)。
由map()方法返回的MappedByteBuffer对象的行为在多数方面类似一个基于内存的缓冲区,只
不过该对象的数据元素存储在磁盘上的一个文件中。调用get()方法会从磁盘文件中获取数据,此数据
反映该文件的当前内容,即使在映射建立之后文件已经被一个外部进程做了修改。通过文件映射看到的数
据同您用常规方法读取文件看到的内容是完全一样的。相似地,对映射的缓冲区实现一个put()会更新
磁盘上的那个文件(假设对该文件您有写的权限),并且您做的修改对于该文件的其他阅读者也是可见的。
通过内存映射机制来访问一个文件会比使用常规方法读写高效得多,甚至比使用通道的效率都高。因为不
需要做明确的系统调用,那会很消耗时间。更重要的是,操作系统的虚拟内存可以自动缓存内存页(memory
page)。这些页是用系统内存来缓存的,所以不会消耗Java 虚拟机内存堆(memory heap)。
一旦一个内存页已经生效(从磁盘上缓存进来),它就能以完全的硬件速度再次被访问而不需要再次调用系
统命令来获取数据。那些包含索引以及其他需频繁引用或更新的内容的巨大而结构化文件能因内存映射机
制受益非常多。如果同时结合文件锁定来保护关键区域和控制事务原子性,那您将能了解到内存映射缓冲
区如何可以被很好地利用。
下面让我们来看一下如何使用内存映射:
1. public abstract class FileChannel extends AbstractChannel implements ByteChannel,
GatheringByteChannel, ScatteringByteChannel {
2. // 这里仅列出部分API
3. public abstract MappedByteBuffer map (MapMode mode, long position, long size)
4. public static class MapMode
5. {
6. public static final MapMode READ_ONLY
7. public static final MapMode READ_WRITE
8. public static final MapMode PRIVATE
9. }
10. }
可以看到,只有一种map()方法来创建一个文件映射。它的参数有mode,position 和size。参
数position 和size 同lock()方法的这两个参数是一样的(在前面的章节中已有讨论)。我们可
以创建一个MappedByteBuffer来代表一个文件中字节的某个子范围。例如,要映射100到299(包
含299)位置的字节,可以使用下面的代码:
buffer fileChannel.map (FileChannel.MapMode.READ_ONLY, 100, 200);
如果要映射整个文件则使用:
buffer fileChannel.map (FileChannel.MapMode.READ_ONLY, 0, fileChannel.size ());
与文件锁的范围机制不一样,映射文件的范围不应超过文件的实际大小。如果您请求一个超出文件大小的
映射,文件会被增大以匹配映射的大小。假如您给size 参数传递的值是Integer.MAX_VALUE,
文件大小的值会膨胀到超过2.1GB。即使您请求的是一个只读映射,map()方法也会尝试这样做并且大
多数情况下都会抛出一个IOException 异常,因为底层的文件不能被修改。该行为同之前讨论的文件
“空洞”的行为是一致的。详情请参考 3.3.1 节。
FileChannel 类定义了代表映射模式的常量,且是使用一个类型安全的枚举而非数字值来定义这些常
量。这些常
您可能关注的文档
- 第1章_电力系统概论.ppt
- HDS.EMC.Netapp存储虚拟化-软件定义存储-私有云技术总结.pdf
- HDX 8000 终端操作使用.pptx
- 第1章半导体二极管与其基本电路.ppt
- 第1章第1节-普通晶闸管(2).pdf
- Hi-Q数据采集软件使用说明书.pdf
- 第1章晶体二极管(1).ppt
- 第1章企业供电系统概论.ppt
- 第1章汽车电子控制技术基础.ppt
- hp p2000存储维护手册.pdf
- 学习型蚁群算法求解一类复杂两级车辆路径问题.docx
- 中巴合作新篇章:共筑发展桥梁,携手共创未来-241128-申万宏源-16页.docx
- 新集能源(601918)煤电联营系列研究之一:新集能源——当煤电联营在需求中心,双赢就是我赢两次-241124-方正证券-24页.docx
- 银行业新周期、新格局系列报告之再融资专题:打开国有大行再融资窗口有其重要性、必要性-241121-申万宏源-19页.docx
- 行业比较高质量就业专题:从上市公司员工人数和薪酬来看行业结构变迁-241126-申万宏源-15页.docx
- 医疗多模态技术必威体育精装版综述 Has Multimodal Learning Delivered Universal Intelligence in Healthcare A Comprehensive Survey.docx
- 雄帝科技 全球领先的可信数字身份产品提供商,海外拓疆打开业务增长新空间.docx
- 我国智算发展的挑战与建议_.docx
- 一张图看懂生物基塑料.docx
- 微观流动性观察:市场情绪趋谨慎,日均成交额跌破2万亿元关口-241125-国元证券-35页.docx
文档评论(0)