前言
计算机毫无用处,除了答案什么也没有。
——毕加索
本书介绍了Java平台上的高级输入/输出,具体点说,就是使用Java 2标准版(J2SE)软件开发包(SDK)1.4及以后版本进行的输入/输出。J2SE 1.4版代号Merlin,包含可观的I/O新特性,对此我们将作详细论述。这些新的I/O特性主要包含在java.nio软件包及其子包中,并被命名为New I/O(NIO)。通过本书,您将学会如何使用这些令人兴奋的新特性来极大地提升Java应用程序的I/O效率。
Java真正的归宿还在企业应用(何谓“企业应用”,恐怕还没有一个确切的定义),但与本地编译语言相比,Java在I/O领域一直处于劣势,这种情况直到J2SE SDK发布了1.4版以后才有了改观。Java的劣势源于其最大的优势:一次编写,到处运行。Java需要运行于虚拟机(即JVM)之上,为了保证Java字节码在各种JVM部署平台上运行效果一致,作些妥协是必须的。既然需要通用于不同的操作系统平台,那么,某种程度上就必须选择各种平台都接受的处理方案。
最切实地感受到妥协带来的后果的,莫过于I/O领域。虽然Java有一套完备的I/O类,但迄今为止还只是针对通用特性,通常位于高端抽象层,横跨各种操作系统。这些I/O类主要面向流数据,经常为了处理个别字节或字符,就要执行好几个对象层的方法调用。
这种面向对象的处理方法,将不同的I/O对象组合到一起,提供了高度的灵活性,但需要处理大量数据时,却可能对执行效率造成致命伤害。I/O的终极目标是效率,而高效的I/O往往又无法与对象形成一一对应的关系。高效的I/O往往意味着您要选择从A到B的最短路径,而执行大量I/O操作时,复杂性毁了执行效率。
传统Java平台上的I/O抽象工作良好,适应用途广泛。但是当移动大量数据时,这些I/O类可伸缩性不强,也没有提供当今大多数操作系统普遍具备的常用I/O功能,如文件锁定、非块I/O、就绪性选择和内存映射。这些特性对实现可伸缩性是至关重要的,对保持与非Java应用程序的正常交互也可以说是必不可少的,尤其是在企业应用层面,而传统的Java I/O机制却没有模拟这些通用I/O服务。
具体的企业在具体的系统上配置具体的应用,这里无关乎抽象。在现实世界,效率是大事——头等大事。企业购置的用于部署大型应用的计算机系统,其I/O性能异常卓越(系统供应商往往投入巨资进行研发),而Java迄今为止一直无法充分利用这一点。当企业的需求是以最快的速度传送大量数据时,样貌朴实但迅捷的解决方案往往胜过漂亮却动作迟缓的。总之一句话,时间就是金钱。
JDK 1.4是由Java社区进程(Java Community Process)主导发行的首个主要发行版。Java产品的用户和供应商可就Java平台需要引入什么新特性提出要求和建议,JCP(http://jcp.org/)为此提供了手段。本书的主题——Java New I/O(NIO)——就是这样一项提议的产物。Java规范请求#51(JSR 51, http://jcp.org/jsr/detail/51.jsp)包含了对高速、可伸缩I/O特性的详尽描述,借助这一特性,底层操作系统的I/O性能可以得到更好发挥。JSR 51的实现,其结果就是新增类组合到一起,构成了java.nio及其子包,以及java.util.regex软件包,同时现存软件包也相应作了几处修改。JCP网站详细介绍了JSR的运作流程,以及NIO从最初的提议到最终实现并发布的演进历程。
随着Merlin的发布,操作系统强大的I/O特性终于可以借助Java提供的工具得到充分发挥。论及I/O性能,Java再也不逊于任何一款编程语言。
组织形式
本书分六章,每章针对NIO的一个大的方面。第一章讨论一般I/O概念,为以后各章相关论述作了铺垫。第二至第四章论及NIO的核心内容:缓冲区、通道和选择器。接下来介绍新引入的正则表达式API。正则表达式的处理与I/O紧密贴合,亦被纳入JSR 51特征集之内。最后,我们看一下新的可插拔字符集映射系统,这也是NIO和JSR 51的组成部分。
以下概要,是专门为那些迫不及待往前赶的人准备的。
缓冲区(Buffers)
新的Buffer类是常规Java类和通道之间的纽带。原始数据元素组成的固定长度数组,封装在包含状态信息的对象中,存入缓冲区。缓冲区提供了一个会合点:通道既可提取放在缓冲区中的数据(写),也可向缓冲区存入数据供读取(读)。此外,还有一种特殊类型的缓冲区,用于内存映射文件。
第二章将详细讨论缓冲区对象。
通道(Channels)
NIO新引入的最重要的抽象是通道的概念。Channel对象模拟了通信连接,管道既可以是单向的(进或出),也可以是双向的(进和出)。可以把通道想象成连接缓冲区和I/O服务的捷径。
某些情况下,软件包中的旧类也可以使用通道。为了能够向与文件或套接字关联的通道进行存取,适当的地方都增加了新方法。
多数通道可工作在非阻塞模式下,这意味着更好的可伸缩性,尤其是与选择器一同使用的时候。
通道会在第三章作详细介绍。
文件锁定和内存映射文件(File locking and memory-mapped files)
新的FileChannel对象包含在java.nio.channels软件包内,提供许多面向文件的新特性,其中最有趣的两个是文件锁定和内存映射文件。
在多个进程协同工作的情况下,要协调各个进程对共享数据的访问,文件锁定是必不可少的工具。
将文件映射到内存,这样在您看来,磁盘上的文件数据就像是在内存中一样。这利用了操作系统的虚拟内存功能,无需在内存中实际保留一份文件的拷贝,就可实现文件内容的动态高速缓存。
文件锁定和内存映射文件也在第三章讨论。
套接字(Sockets)
套接字通道类为使用网络套接字实现交互提供了新方法。套接字通道可工作于非阻塞模式,并可与选择器一同使用。因此,多个套接字可实现多路传输,管理效率也比java.net提供的传统套接字更高。
三个新套接字通道,即ServerSocketChannel、SocketChannel和DatagramChannel,将在第三章讲到。
选择器(Selectors)
选择器可实现就绪性选择。Selector类提供了确定一或多个通道当前状态的机制。使用选择器,借助单一线程,就可对数量庞大的活动I/O通道实施监控和维护。
选择器会在第四章作详细介绍。
正则表达式(Regular expressions)
新增的java.util.regex软件包将类似Perl语言的正则表达式处理机制引入Java。这一人们期盼已久的特性有着广泛用途。
新的正则表达式API之所以被看成是NIO的组成部分,是因JSR 51把它与其他NIO特性放在一起作了详细说明。虽然它在许多方面与NIO的其他组成部分缺乏平行关系,但它在文件处理等众多领域都是极其有用的。
第五章讨论JDK 1.4正则表达式API。
字符集(Character sets)
java.nio.charsets提供了新类用于处理字符与字节流之间的映射关系。您可以对字符转换映射方式进行选择,也可以自己创建映射。
字符代码转换的相关问题在第六章讨论。
目标读者
本书为中高级Java程序员所写:他们熟练掌握这门语言,在完成大规模、复杂的数据处理任务时,有充分利用Java NIO所提供的新特性的愿望和需求。在写作的过程中,我假定您对JDK标准类软件包、面向对象的设计技巧、继承等等都有充分了解。我还假定您了解I/O在操作系统层面的基本工作原理,知道什么是文件,什么是套接字,什么是虚拟内存,诸如此类。第一章就这些概念作了高屋建瓴的回顾,但没有深度剖析。
如果您对Java平台上的I/O软件包尚处于摸索阶段,也许您应该先读一读Elliote Rusty Harold所著《Java I/O》(O'Reilly)(http://www.oreilly.com/catalog/javaio/)。那是一本关于java.io软件包的很好的入门教材。虽然可以把本书看作那本书的后续读物,但两者并无承接关系。本书重点关注的是如何利用新的java.nio软件包实现I/O性能的最大化。另外,本书还引入了一些新的I/O概念,这也超出了java.io软件包的范畴。
我们还探讨了字符集编码和正则表达式,这也是与NIO绑定在一起的新特征集的一部分。为软件国际化或专业应用使用字符集的程序员会对java.nio.charsets软件包感兴趣,第六章会有相关讨论。
如果您已转向Java,但时不时地需要回到Perl处理正则表达式,告诉您,以后再也不用了。新推出的java.util.regex软件包在标准JDK中包含了Perl 5所有的正则表达式功能,个别极其晦涩难懂的除外,此外还有几项创新。
软件及版本
本书描述了Java的I/O性能,尤其是java.nio和java.util.regex两个软件包。这两个软件包首次出现于J2SE 1.4版,所以,您必须拥有Java SDK 1.4(或以后)的可用版本,才能使用本书提供的素材。您可通过访问Sun公司网站http://java.sun.com/j2se/1.4/获得Java SDK。我还会在正文中使用J2SE SDK指代Java开发包(JDK),在本书范围内,二者含义相同。
本书基于2002年2月发布的SDK最终版本1.4.0。早前几个月,1.4 beta版已广为流传。在最终版本即将发布之前,NIO API作了重要修正。因此,您会发现本书所讲某些细节,与您在最终版本发布之前所知论述存在出入。本书根据所有已知的最后修正作了更新,应该不存在与最终版本1.4.0不一致之处。J2SE的后续版本可能引入与本书相冲突的内容,如果存在疑问,请参考与软件一同发布的技术文档。
本书包含众多实例,向您示范如何使用API。所有代码举例及相关信息都可从http://www.javanio.info/下载,更多实例和测试代码也可从该网站取得。NIO执行小组提供的额外代码示例可从http://java.sun.com/j2se/1.4/docs/guide/nio/example/取得。
分享到:
相关推荐
### Java NIO 系列教程(一):Java NIO 概述 #### 一、引言 Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels...
书的目录包括引言、组织结构、目标读者、软件和版本、本书中的约定、如何联系我们、致谢,以及后续章节对各个主题的详细讨论,如NIO的介绍、基本概念、缓冲区、通道、选择器、字符集处理、文件操作和正则表达式的...
### Java NIO原理 图文分析及代码实现 #### 前言 在深入探讨Java NIO之前,我们先简要回顾一下NIO的概念及其引入的原因。随着互联网的发展,越来越多的应用程序需要处理高并发的网络连接请求。传统的阻塞I/O模型在...
### Java NIO与IO的区别和比较 #### 引言 随着网络技术的飞速发展,企业和个人对网络应用程序的性能要求日益提高。特别是在高并发环境下,服务器需要处理来自数百乃至数千个客户端的同时连接请求,这使得传统的...
### Java NIO的介绍及工作原理 #### 一、引言 Java NIO(New I/O)是Java 1.4版本引入的一个重要的I/O处理框架,它为Java应用程序提供了处理I/O操作的新方法。与传统的Java IO模型相比,NIO提供了一种更加高效的...
### Java NIO (New IO) 详解 #### 1. 引言 在Java的世界里,I/O(Input/Output)操作是程序与外部环境进行交互的重要方式之一。随着技术的发展,传统I/O模型逐渐显露出一些局限性,特别是在处理高并发场景下,其...
### Java NIO 在并发型服务器设计中的应用 #### 引言 随着计算机硬件技术的不断发展,尤其是多处理器架构的普及、网络技术的进步以及分布式应用程序的需求日益增加,并发式多任务服务器的设计变得尤为重要。这类...
### 基于Java NIO的非阻塞通信的研究与实现 #### 摘要 本文探讨了Java NIO(New I/O)框架中的非阻塞通信机制,并对其原理及应用进行了深入研究。NIO是一种现代I/O处理方法,通过引入缓冲区、通道和选择器等新概念...
### Java NIO (New Input/Output):IBM技术文档概览与详解 #### 一、引言 在Java开发领域,高效的数据输入输出处理一直是开发者关注的重点之一。随着JDK 1.4的发布,一个新的输入输出库——NIO(New Input/Output...
### Java NIO 详细讲解 #### 一、引言与背景 随着计算机技术的发展和互联网应用的日益增多,数据处理的效率成为软件开发中的一个重要考量因素。Java NIO(New I/O)作为JDK 1.4引入的一项新技术,旨在解决传统IO...
### Pro Java 7 NIO2:深入理解Path类与文件系统操作 #### 一、引言 《Pro Java 7 NIO2》是一本专注于Java 7中的新I/O(NIO.2)特性的书籍,它介绍了如何利用Java 7的新特性来处理文件和网络操作。本书的核心在于...
### Java NIO 电子书知识点概述 #### 一、引言 **Java NIO (New Input/Output)** 是 Java 平台的一种新的输入输出处理方式,首次出现在 Java 1.4 版本中。它提供了比传统 Java IO 包更高效、更灵活的 API,特别是在...
### JAVANIO在Socket通讯中的应用 #### 引言 在Java开发中,网络通信是常见需求之一,其中Socket编程是最基础也是最重要的技术之一。然而,在传统的Java Socket编程中,由于采用的是阻塞I/O模型,即所有的读写操作...
### Java NIO API详解 #### 一、引言 在Java早期版本中,I/O操作主要依赖于`java.io`包中的流式API,这些API虽然简单易用,但其本质是阻塞式的,这意味着每次读写操作都会等待直至完成。这种机制在处理大量并发...
### Java NIO 详解 #### 一、引言与背景 在Java开发中,网络通信是必不可少的一部分。传统的Java I/O(通常称为BIO或Blocking I/O)在处理大量并发连接时存在一定的性能瓶颈。为了解决这些问题,在JDK 1.4中引入了...