1. 首页
  2. 编程语言
  3. Java
  4. Java NIO.pdf

Java NIO.pdf

上传者: 2018-12-25 15:20:37上传 PDF文件 2.15MB 热度 20次
java nio编程非阻塞模式的通信电子书 带目录标签目录题献看看鲁·;·。●。鲁bD。鲁●。。··●●··●●●bbI1前言。看番。。。。。。吾b。●●。。番。。。。。。b4·······:4···········4·4·····444·42组织形式日标读者软件及版本本书中使用的约定如何联系我们7鸣谢.第一章简介…幽血击幽。。曲。。101.1IO与CPU时间的比较…1012CPU已不再是束缚1.3进入正题1.4ⅠO概念1.5总结20第二章缓冲区…222.1缓冲区基础2322创建缓冲区…+3623复制缓冲区24字节缓冲区25总结第三章通道533.1通道基础…3.2 Scatter/ Gather3.3文件通道34内存映射文件3.5套接字通道963.6管道11737通道实用工具类.1223.8总结123第四章选择器.·4···········4·4·········4··4···4···4···········44441254.选择器基础l264,2使用选择键1324.3使用选择器.13544异步可关闭性1444.5选择缩放t4idaddddadib41444.6总结148第五章正则表达式1505.1正则表达式基础.15152Java正则表达式API53字符串类正则表达式方法54Java正则表达式语法1745.5面向对象的文件检索56总结186第六章字符集11876.1字符集基础.18762字符集········.;:···1886.3字符集服务提供接∴…20764总结217附录A.NIO与JN1a218附录B.可选择通道SPL…n220附录C.NIO快速参考…223C. I javanio包223C2 java nio channels包230C3 javanio channels. spi E,··着·。·242C4 ava. nio charset包244C5 javaniocharset. spi包248C6 java util. regex包248题献给我的妻子, Karen。离了你我可怎么办?前言计算列亳无用处,除了答案什么也没有。毕加索本书介绍了Java平台上的高级输λ/输出,具体点说,就是使用Java2标准版(J2SE)软件开发包(SDK)1.4及以后版木进行的输入/输出。J2SE14版代号 Merlin,包含可观的IO新特性,对此我们将作详细论述。这些新的IO特性主要包含在java.rio软件包及其子包中,并被命名为 New /0(NIO)。通过本书,您将学会如何使用这些令人兴奋的新特性来极大地提升Java应用程序的1O效率。Java真正的归宿还在企业应用(何谓“企业应用”,恐怕还没有一个确切的定义),但与本地编译语言相比,Java在Io领域一直处于劣势,这种情况直到 J2SE SDK发布了1.4版以后才有了改观。Java的劣势源于其最大的优势:一次编写,到处运行。Java需要运行于虚拟机(即JM)之上,为了保证Java字节码在各和JVM部署平台上运行效果一致,作些妥协是必须的。既然需要通用于不冋旳操作系统平台,那么,某种程度上就必须选择各种丬台都接受的处理方案最切实地感受到妥协带来的后果的,莫过于IO领域。虽然Java有一·套完备的IO类,但迄今为止还只是针对通用特性,通常位于高端抽象层,横跨寳种操作系统。这些O类主要面向流数据,经常为了处理个别字节或字符,就要执行好几个对象层的方法调用。这种面向对象的处理方法,将不同的IO对象组合到一起,提供了高度的灵活性,但需要处理大量数据时,却可能对执行效率造成致命伤害。IO的终极目标是效率,而高效的IO往往乂尢法与对象形成一一对应的关系。高效的1O往往意味着您要选择从A到B的最短路径,而执行大量IO操作时,复杂性毁了执行效率,传统Jaa平台上的O抽象匚作良好,适应用途广泛。但是当移动大量数据吋,这些IO类可缩性不强,也没有提供当今大多数操作系统普遍具备的常用IO功能,如文件镤定、非块IO就绪性选择和内存映射。这些特性对实现可伸缩性是至关重要的,对俣持与非Java应用程序的正常交互也可以说是必不可少的,尤其是在企业应用层面,而传统的 Java lo机制却没有模拟这些通用IO服务。具体的企业在具体的系统上配置具体的应用,这里无关乎抽象。在现实世界,效率是大事头等大事。企业购置的用亍部署大型应用的计算机系统,其IO性能昇常卓越(系统供应商往往投入巨资进行研发),而Java迄今为止一直无法充分利用这一点。当个业的需求是以最快的速度传送大量数据吋,样貌朴实但迅捷的解决方案往往胜过漂亮却动作迟缓的。总之一句话,吋间就是金钱JDK14是由Java社区进程( Java Community Process)主导发行的首个主要发行版。Java产品的用户和供应商可就Java台需要引入什么新特性提出要求和建议,JCP(ht:/jcp.org)为此提供了手段。本书的主题— Java New i/o(NO)—就是这样一项提议的产物。Java规范请求#51(JSR51,hup:/ jcp. org/jsr/detail/51jsp)包含了对高速、叮仲缩IO特性的详尽描述,借助这一特性,底层操作系统的O性能可以得到更好发挥。JSR51的实现,其结果就是新增类组合到一起,构成了iava.nio及其了包,以及java.uti1. regex软件包,同吋现存软件包也相应作了几处修改。JCP网站详细介绍了JSR的运作流程,以及NIO从最初的提议到最终实现并发布的演进历程。随着 Merlin的发布,操作系统强大的O特性终于可以借助Java提供的工具得到充分发挥。论及Ⅰ○性能,Jaa冉也个逊于任何一款编程语言。组织形式本书分六章,每章针对NIO的一个大的方面。第一章讨论般O概念,为以后各章相关论述作了铺垫。第二至第四章论及NIO的核心内容:缓冲区、通道和选择器。接下来介绍新引入的正则衣达式API。正则表达式的处理与IO紧密贴合,亦被纳入JSR51特征集之内。最后,我们看下新的可插拔字符集映射系统,这也是NIO和JSR51的组成部分。以下概要,是专门为那些迫不及待往前赶的人准备的。缓冲区( Buffers)新的 Buffer类是常规Java类和通道之间的纽带。原始数据元素组成的固定长度数组,封装在包含状态信息的对象中,存入缓冲区。缓冲区提供∫一个会合点:通道既可捉取放在缓冲区中的数据(写),也可向缓冲区存入数据供读取(读)。此外,还有一种特殊类型的缓冲区,用于内存映射文件第二章将详细讨论缓冲区对象通道( Channels)NIO新引入的最重要的抽象是通道的慨念。 Channel对象模拟了通信连接,管道既可以是单向的(进或出),也可以是双向的(进和出)。可以把通道想象成连接缓冲区和IO服务的捷径。某些情况下,软件包中的旧类可利用通道。为了能够向与文件或套接字关联的通道进行存取,适当的地方都增加了新方法多数通道可工作在非块模式下,这意味着更好的可仰缩性,尤其是与选择器一冋使用的时候通道会在第二章作详绀介绍。文件锁定和内存映射文件( File locking and memory- mapped files新的 Filechannel对象包含在java.nio. channels软件包内,提供许多面向文件的新特性,其中最有趣的两个是文件锁定和内存映射文件。仨多个进程协同工作的情况下,要协调各个进程对共享数据的访问,文件锁定是必不可少的工将文件映射到内存,这样在您看来,磁盘上的文件数据就像是在内存中一样。这利用了操作系统的拟内存功能,无需在内冇中实际保留一份文件的拷贝,就可实现文件内容的动态高速缓有冇。文件锁定和内存映射文件也在第三章讨论套接字( Sockets)套接字通道类为使用网络套接字实现交互提供了新方法。套接字通道可工作于非块模式,并可与选择器一同使用。因此,多个套接字可实现多路传输,管理效率也比java,net提供的传统套接字更高个新套接字通道,即 Server Socketchannel、 Socketchannel和 Datagram Channel,将在第三章讲到选择器(Se/ ectors)选择器可实现就绪性选择。 Selector类提供了确定一或多个通道当前状态的忛制。使用选择器,借助单一线程,就可对数量庞大的活动IO通道实施监控和维护。选择器会在第四章作详细介绍。正则表达式( Regular expressions)新增的java.uti1. regex软件包将类似Per语言的正则表达式处理机制引入Java。这一人们期盼已久的特性有着广泛用途。新的正则表达式API之所以被看成是NIO的组成部分,是因JSR51把它与其他NO特性放在起作了详细说明。虽然它在许多方面与NIO的其他组成部分缺乏平行关系,但它在文件处理等众多领域都是极其有用的。第五章讨论JDK1.4正则表达式API。字符集( Character sets)java.nio, charsets提供了新类用丁处理字符与宇节流之问的映射关系。您可以对字符转4换映射方式进行选择,也可以自己创建映射字符代码转换的相关问题在第六章讨论。目标读者本书为中高级Jaa程序员所与:他们熟练掌握这门语言,在完成大规模、复杂的数据处理仼务时,有充分利用 Java nio所提供之新特性的愿望和需求。在写作的过程中,我假定您对JDK标准类软件包、面向对象的设计技巧、继承等等都有充分∫解。我还假定您了解IO在操作系统层面的基本工作原理,知道什么是文件,什么是套接字,什么是虚拟内存,诸如此类。第一章就这些概念作了高屋建瓴的回顾,但没有深度剖析、如果您对Java平台上的O软件包尚处于摸索阶段,也许您应该先读一读 Elliote Rusty Harold所著《 JJava i/o》( OReilly)(htt:!ww. oreilly. com/catalog/javaio/)。那是一本关于java.i软件包的很好的入门教材。虽然可以把本书看作那本书的后续读物,但两者并无承接关系。本书重点关注的是如何利用新的java.nio软件包实现IO性能的最大化。另外,本书还引入了一些新的IO概念,这也超出了java.io软件包的范畴我们还探讨了字符集编码和正则表达式,这也是与NO绑定在一起的新特征集的一部分。为软件国际化或专业应用使用字符集的程序员会对iava.nio. charsets软件包感兴趣,第六章会有相关讨论。如果您已转向Java,但时不时地需要回到Perl处理正则表达式,告诉您,以后再也不用了。新推出的java,uti1, regex软件包在标准JDK中包含了Perl5所有的正则表达式功能,个别极其晦涩难懂的除外,此外还有几项创新软件及版本本书描述了Java的JO性能,尤其是java.nio和java,uti1.regeⅹ两个软件包。这两个软件包首次出现于JSE14版,所以,您必须拥有 Java sdk14(或以后)的可用版本,才能使用本书提供的素材。您可过访问Sm公司网站htφp:/java.sun.com/l2se/1.4/获得JavasdK。我还会在正文中使用J2 SE SDK指代Java开发包(JDK),在本书范围内,二者含义相同。本书基于2002年2月发布的SDK最终版本1.4.0。早前几个月,1.4beta版已广为流传。在最终版本即将发布之前, NIO API作了重要修正。因此,您会发现本书所讲某些细节,与您在最终版木发布之前所知论述存在出入。木书根据所有已知的最后修正作了更新,应该不存在与最终版木140不一致之处。J2SE的后续版本可能引入与本书相冲突的内容,如果存在疑问,请参考与软件同发布的技术文档。本书包含众多实例,向您示范如何使用API。所有代码举例及相关信息都可从ht/www.avanlo.infor/下载,更多实例和测试代码也可从该网站取得。NIO执行小组提供的额外代码示例可从ht:java. sun. com/2sc/14 /docs/guidc/nio/cxamplc取得。本书中使用的约定像所有稈序员一样,我对代码的排版样式也有宗教般的虔诚。本书所举范例系根据我个人喜好进行的排版,在相当程度上也符合惯例。我信奉的标准是,一个制表符缩进八格,外加大量的空白分隔符。有些代码举例迫于空间有限,把缩进减少到四格。网站上供下载的源代码使用制表符产生缩进。当我就API举例,展示JK中某个类的方法列表时,我一般只列出上下文提到的特定方法,而把无关方法略去。我運常在章节的开头提供完整的API刎表,而在随后的具体讨论环节列出其子集这些APⅠ示例通常在语法上并不正确,只是若干方法签名的片段,没有方法主体,仅用于列举可用方法及认可参数。例如public class Focpublic static final int MODE ABCpublic static final int MODE XYZpublic abstract void baz (Blather blather)ipublic int blah (Bar bar, Bop bop)本例中,方法baκ()在语法上是完整的,因为抽象声明只包含签名。但blah()缺少分号,暗示在该类定义中应当有方法主体跟随其后。当我罗列公共域定义常数,如 MODE ABC和 MODE XYZ的时候,有意省略了初始值,因为省去的信息不重要。既然定义了公共名,就可以在不知道值的情况下使用该常数。只要有可能,我尽量直接从随1.4JDK分发的代码截取API信息、。我着手写作木书的时候,JDK的版本是1.4beta2。为了保证代码片段是最新的,我尽了一切努力,如有疏漏,在此表示歉意,JDK提供的源代码才是最终权威字体约定本书采用 OReilly标准宇体约定,这并非完全出于个人选择。本书手稿直接以XML格式创作,使用纯 Java gul编辑器(ⅩXE,htp:!/w. xmlmind. com)。该软件强制使用DIⅠ及OReilly的 DocBook子集,因此,我从未指定字体或字形。我π以选择XML元素,如
下载地址
用户评论