Java+NIO+(中文版)
NIO 中文版学习;对于学习NIO基础知识非常有用,欢迎大家来下载;目录题献...…1前言···············444·44·4····4···●●··444··a·44······a·4···2组织形式日标读者软件及版本本书中使用的约定如何联系我们···,·幸鸣谢.第一章简介…101.1IO与CPU时间的比较1012CPU已不再是束缚1.3进入正题.1.4ⅠO概念…·;·;垂··.中··,;·垂·,·131.5总结20第二章缓冲区4444···4············4444444·····.········444444·2221缓冲区基础2322创建缓冲区362.3复制缓冲区..·3824字节缓冲区.402.5总结·;;··垂·;和第三章通道.33.1通道基础.3.2 Scatter/Gather3.3文件通道6834内存映射文件35套接字通道963.6管道.1173.7通道实用工具类1223.8总结123第四章选择器.1254.1选择器基础1264,2使用选择键13243使用选择器.1354.4异步可关闭性1444.5选择缩放.1444.6总结148第五章正则表达式111115051止则表达式基础15152Java正则表达式API…15353字符串类正则表达式方法15354Java正则表达式语法1745.5面向对象的文件检索18056总结186第六章字符集1876.1字符集基础.18762字符集∴1886.3字符集服务提供接|1∴20764总结···2l7附录A.NIO与JN........1218附录B.可选择通道sPI22044444444444444···命··命·命命·444444附录C.NIO快速参考.23C. 1 java nio包223C2 java nio channels包C3 java nio channels.spi EJ242C.4 java nio charset包244C5 java nio charset. spi E248C 6 java util. regex248题献给我的妻子,Kren离了你我可怎么办?前言计算机亳用处,除答案什么也没有。毕加索本书介绍了Jaa平台上的高级输入/输出,具体点说,就是使用Java2标准版(J2SE)软件开发包(SDK)1.4及以后版木进行的输入/输出。J2SE1.4版代号 Merlin,包含可观的IO新特性,对此我们将作详细论述。这些新的IO特性主要包含在ava.nio软件包及其子包中,并被命名为 New /0(NIO)。通过本书,您将学会如何使用这些令人兴奋的新特性来极大地提∫Java应用程序的IO效率Java真正的归宿还在企业应用(何谓“企业应用”’,恐怕还没有一个确切的定义),但与本地编译语言相比,Java在IO领域一直处于劣势,这种情况直到 J2SE SDK发布了1.4版以后才有了改观。Java的劣势源于其最大的优势:一次编写,到处运行。Java需要运行于虚拟机(即JM)之上,为了保证Jaa字节码在各种JVM部署平台上运行效果一致,作些妥协是必须的。既然需要通用于不冋的操作系统平台,那么,某种程度上就必须选择各种平台都接受的处理方案。最切实地感受到妥协带来的后果的,莫过于ⅣO领域。虽然Java有·套完备的IO类,但迄今为止还只是针对通用特性,通常位于高端抽象层,槓跨冬种操作系统。这些IO类主要面向流数据,经常为了处理个别字节或字符,就要执行好几个对象层的方法调用。这种面向对象的处理方法,将不同的IO对象组合到一起,提供了高度的灵活性,但需要处理大量数据时,却可能对执行效率造成致命伤害。IO的终极目标是效率,而高效的IO往往又无法与对象形成一一对应的关系。高效的IO往往意味着您要选择从A到B的最短路径,而执行大量IO操作时,复杂性毁∫执行效率。传统Java平台上的IO抽象匚作良好,适应用途广泛。但是当栘动大量数据吋,这些IO类可伸缩性不强,也没有提供当今大多数操作系统普遍具备的常用IO功能,如文件锁定、非块IO、就绪性选择和内存映射。这些特性对实现可伸缩性是至关重要的,对保持与非Java应用程序的正常交互也可以说是必不可少的,尤其是在企业应用层面,而传统的 Java lc机制却没有模拟这些道用IO服务。具体的企业在具体的系统上配置具体的应用,这里无关乎抽象。在现实世界,效率是大事头等大事。企业购置的用」部署大型应用的计算札系统,其IO性能异常卓越(系统供应商往往投入巨资进行研发),而Java迄今为止一直无法充分利用这一点。当个业的需求是以最快的速度传送大量数据忖,样貌朴实但迅捷的解决方案往往胜过漂亮却动作迟缓的。总之·句话,吋间就是金钱JDK14是由Java社区进程( Java Community Process))主导发行的首个主要发行版。Java产品的用户和供应商可就Java平台需要引入什么新特性提出要求和建议,JCP(htp;/jcp.org/)为此提供了手段。本书的主题— java New lo(NIO)—就是这样一项提议的产物。Java规范请求#51(JSR51,hp;jcp. ory/jsr/delail51j)包含了对高速、可伸缩Io特性的详尽描述,借助这一特性,底层操作系统的IO性能可以得到更好发挥。JSR51的实现,其结果就是新增类组合到一起,构成了java.nio及其了包,以及java.uti1.reqeⅹ软件包,同吋现仔软件包也相应作了几处修改。JCP网站详细介绍了JsR的运作流稈,以及NIO从最初的提议到最终实现并发布的演进历程随着 Merlin的发布,操作系统强大的O特性终于可以借助Java提供的工具得到充分发挥。论及IO性能,Java再也不逊于任何一款编程语言,组织形式本书分六章,每章针对NIO的·个大的方面。第·章讨论·般IO枧念,为以后各章相关论述作了铺垫。第二至第四章论及NIO的核心内容:缓冲区、通道和选择器。接下来介绍新引入的正则衣达式API。正则衣达式的处理与IO紧密贴合,亦被纳入JSR51特征集之内。最后,我们看下新的可插拔字符集映射系统,这也是NIO和JSR51的组成部分。以下概要,是专门为那些迫不及待往前赶的人准备的。缓冲区( Buffers)新的 Buffer类是常规Java类和通道之间的纽带。原始数据元素组成的固定长度数组,封装在包含状态信息的对象中,存入缓冲区。缓冲区提供∫一个会合点:通道既可提取放在缓冲区中的数据(写),也可向缓冲区存入数据供读取(读)。此外,还有一种特殊类型的缓冲区,用于内存映射文件。第二章将详细讨论缓冲区对象通道( Channels)NIO新引入的最重要的抽象是通道的概念。 Channel对象模拟了通信连接,管道既可以是单向的(进或出),也可以是双向的(进和出)。可以把通道想象成连接缓冲区和1O服务的捷径。某些情况下,软件包中的旧类可利用通道。为了能够向与文件或套接字关联的通道进行存取,适当的地方都增加了新方法。多数通道可工作在非块模式下,这意味着更好的可仰缩性,尤其是与选择器一同使用的时候。通道会在第三章作详绀介绍。丈件锁定和内存映射文件( File locking and memory- mapped files)新的 Filechannel对象包含在java.ni. channels软件包内,提供许多面向文件的新特性,其中最有趣的两个是文件锁定和内存映射文件。在多个进程协同工作的情况下,要协调各个进程对共享数据的访问,文件锁定是必不可少的工只。将文件映射到内存,这样在您看来,磁盘上的文件数据就像是在内存中·样。这利用了操作系统的虚拟内存功能,无需在内存中实际保甯一份文件的拷贝,就可实现文件内容的动态高速缓存。文件锁定和内存映射文件也在第三章讨论。套接字( Sockets)套接字通道类为使用网络套接字实现交互提供了新方法。套接字通道可工作于非块模式,并可与选择器一同使用。因此,多个套接字可实现多路传输,管理效率也比java,neτ提供的传统套接字更高。三个新套接字通道,即 ServerSocketchannet、 Socketchannel和 DatagramChannel,将在第三章讲到。选择器( Selectors)选择器可实现就绪性选择。 Selector类提供了确定一或多个通道当前状态的机制。使用选择器,借助单一线程,就可对薮量庞大的活动IO通道实施监控和维护选择器会在第四章作详细介绍正则表达式( Regular expressions)新增的java.uti1. regex软件包将类似Perl语言的正则表达式处理机制引入Java。这一人们期盼已久的特性有着广泛用途新的正则表达式API之所以被看成是NIO的组成部分,是因JSR51把它与其他NIO特性放在起作了详细说明。虽然它在许多方面与NIO的其他组成部分缺乏平行关系,但它在文件处理等众多领域都是极其有用的第五章讨论JDK1.4正则表达式API字符集( Character sets)java.nio, charsets提供了新类用」处理宇符与字节流之间的映射关系。您可以对字符转4换映射方式进行选择,也可以自己创建映射。宁符代码转换的相关问题在第六章讨论。目标读者本书为中高级Jaa程序员所写:他们熟练掌握这门语言,在完成大规模、复杂的数据处理仼务时,有充分利用 Java nic所提供之新特性的愿望和需求。在写作的过程中,我假定您对JDK标准类软件包、面向对象的设计技巧、继承等等都有充分了解。我还假定您」解IO在操作系统层面的基工作原理,知道什么是文件,什么是套接字,什么是虚拟内存,诸如此类。第一章就这些概念作了高屋建瓴的回顾,但没有深度剖析如果您对JaⅦa平台上的1O软件包尚处于摸索阶段,也许您应该先读读 Elliote Rusty Harold所著《 JJava I/O》( OReilly)(htt:!/ww. oreilly. com/catalog/javaio/)。那是一本关于java.io软件包的很好的入门教材。虽然可以把本书看作那本书的后续读物,但两者并无承接关系。本书重点关注的是如何利用新的java.nio软件包实现IO性能的最大化。另外,本书还引入了一些新的IO概念,这也超出了jaⅵa.i软件包的范畴我们还探讨了字符集编码和正则表达式,这也是与NIO绑定在一起的新特征集的一部分。为软件国际化或专业应用使用宇符集的程序员会对java.nio, charsets软件包感兴趣,第六章会有相关讨论。如果您已转向Java,但时不时地需要回到Perl处理正则表达式,告诉您,以后再也不用了。新推出的ava.uti1,re9ex软件包在标准JDK中包含了Perl5所有的正则表达式功能,个别极其晦涩难懂的除外,此外还有几项创新。软件及版本本书描述了Java的IO性能,尤其是java.nio和java.uti1.reqeⅹ两个软件包。这两个软件包首次出现于JSE14版,所以,您必须拥有 Java sdK1.4(或以后)的可用版本,才能使用本书提供的素材。您可進过访问Sun公司网站htp:/java.sun.comj2se/14获得JavaSDK。我还会在正文中使用J2 SE SDK指代Java开发包(JDK),在本书范围内,二者含义相同本书基于2002年2月发布的SDK最终版本1.4.0。早前几个月,1.4beta版已广为流传。在最终版本即将发布之前, NIO API作了重要修正。因此,您会发现本书所讲某些细芍,与您在最终版木发布之前所知论述存在出入。木书根据所有凵知的最后修止作了更新,应该不存在与最终版木140不一致之处。J2SF的后续版本可能引入与本书相冲突的内容,如果存在疑问,请参考与软件同发布的技术文档本书包含众多实例,向您示范如何使用API。所有代码举例及相关信息都可从码示例可从hp: java.sun. com/2c14( ocs/guide/nid)/ sample,取。NO执行小组提供的额外代ht:/www.javanio.info/下载,更多实例和测试代码也可从该网站取得本书中使用的约定像所有稈序员一样,我对代码的排版样式也有宗教般的虔诚。本书所举范例系根据我个人喜好进行的排版,在相当程度上也符合惯例。我信奉的标准是,一个制表符缩进八格,外加大量的空白分隔符。有些代码举例迫于空间有限,把缩进减少到四格。网站上供下载的源代码使用制表符产生缩进。当我就API举例,展示JDK中某个类的方法列表时,我一般只列出上下文提到的特定方法,而把无关方法略去。我通常在章节的开头提供完整的API列表,而在随后的具体讨论坏节列出其子集这些AP示例通常在话法上并不正确,只是若干方法签名的片段,没有方法主体,仅用于列举可用方法及认可参数。例如:ublic class focpublic static final int MODE ABCpublic static final int MODE XYZpublic abstract void baz (Blather blather)iblic int blah (Bar bar, Bop bop本例中,方法bαz()在语法上是完整的,因为抽象声明只包含签名。但blωh()缺少分号,暗示在该类定义中应当有方法主体跟随其后。当我罗列公共域定义常数,如 MO DE ABC和 MODE XYZ的时候,有意省略了初始值,因为省去的信息不重要。既然定义了公共名,就可以在不知道值的情况下使用该常数。只要有可能,我尽量直接从随1.4JDK分发的代码截取API信息、。我着手写作木书的时候,JDK的版本是1.4beta2。为了保证代码片段是最新的,我尽了一切努力,如有疏漏,在此表示歉意,JDK提供的源代码才是最终杖威字体约定本书采用 OReilly标准宇体约定,这并非完全出于个人选择。本书手稿直接以XML格式创作,使用纯JavaguⅠ编辑器(xxe,http://www.xmlmind.com/)该软件强制使用DIDI及OReilly的 DocBook子集,因此,我从未指定字体或字形。我可以选择XML元素,如
暂无评论