JAVA NIO 入门教程详解(3).pdfVIP

  1. 1、本文档共38页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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 类定义了代表映射模式的常量,且是使用一个类型安全的枚举而非数字值来定义这些常 量。这些常

文档评论(0)

peace0308 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档