Java 在 I/O 领域一直处于劣势,这种状况直到 J2SE SDK 发布了 1.4 版之后才有了改观。 Java 的劣势源于其最大的优点:一次编写,处处运行。 Java 须要运行于虚拟机(即 JVM)之上,为了保证 Java 字节码在各类 JVM 部署平台上运行效果一致,做些妥协是必须的。既然须要通用于不一样的操做系统平台,那么,某种程度上就必须选择各类平台都接受的处理方案。java
最切实地感觉到妥协带来的后果的,莫过于 I/O 领域。虽然 Java 有一套完备的 I/O 类,但迄今为止还只是针对通用特性,一般位于高端抽象层,横跨各类操做系统。这些 I/O 类主要面向流数据,常常为了处理个别字节或字符,就要执行好几个对象层的方法调用。正则表达式
这种面向对象的处理方法,将不一样的 I/O 对象组合到一块儿,提供了高度的灵活性,但须要处理大量数据时,却可能对执行效率形成致命伤害。 I/O 的终极目标是效率,而高效的 I/O 每每又没法与对象造成一一对应的关系。高效的 I/O 每每意味着您要选择从 A 到 B 的最短路径,而执行大量I/O 操做时,复杂性毁了执行效率。express
传统 Java 平台上的 I/O 抽象工做良好,适应用途普遍。可是当移动大量数据时,这些 I/O 类可伸缩性不强,也没有提供当今大多数操做系统广泛具有的经常使用 I/O 功能,如文件锁定、非块 I/O、就绪性选择和内存映射。这些特性对实现可伸缩性是相当重要的,对保持与非 Java 应用程序的正常交互也能够说是必不可少的,尤为是在企业应用层面,而传统的 Java I/O 机制却没有模拟这些通用 I/O 服务。数组
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 软件包,同时现存软件包也相应做了几处修改。缓存
如下概要,是专门为那些火烧眉毛往前赶的人准备的。网络
新的 Buffer 类是常规 Java 类和通道之间的纽带。原始数据元素组成的固定长度数组,封装在包含状态信息的对象中,存入缓冲区。缓冲区提供了一个会合点:通道既可提取放在缓冲区中的数据(写),也可向缓冲区存入数据供读取(读)。此外,还有一种特殊类型的缓冲区,用于内存映射文件。app
NIO 新引入的最重要的抽象是通道的概念。 Channel 对象模拟了通讯链接,管道既能够是单向的(进或出),也能够是双向的(进和出)。能够把通道想象成链接缓冲区和 I/O 服务的捷径。某些状况下,软件包中的旧类可利用通道。为了可以向与文件或套接字关联的通道进行存取,适当的地方都增长了新方法。多数通道可工做在非块模式下,这意味着更好的可伸缩性,尤为是与选择器一同使用的时候。jsp
新的 FileChannel 对象包含在 java.nio.channels 软件包内,提供许多面向文件的新特性,其中最有趣的两个是文件锁定和内存映射文件。在多个进程协同工做的状况下,要协调各个进程对共享数据的访问,文件锁定是必不可少的工具。将文件映射到内存,这样在您看来,磁盘上的文件数据就像是在内存中同样。这利用了操做系统的虚拟内存功能,无需在内存中实际保留一份文件的拷贝,就可实现文件内容的动态高速缓存。工具
套接字通道类为使用网络套接字实现交互提供了新方法。套接字通道可工做于非块模式,并可与选择器一同使用。所以,多个套接字可实现多路传输,管理效率也比 java.net 提供的传统套接字更高。三个新套接字通道,即 ServerSocketChannel、 SocketChannel 和 DatagramChannel。性能
选择器可实现就绪性选择。 Selector 类提供了肯定一或多个通道当前状态的机制。使用选择器,借助单一线程,就可对数量庞大的活动 I/O 通道实施监控和维护。
新增的 java.util.regex 软件包将相似 Perl 语言的正则表达式处理机制引入 Java。这一人们期盼已久的特性有着普遍用途。新的正则表达式 API 之因此被当作是 NIO 的组成部分,是因 JSR 51 把它与其余 NIO 特性放在一块儿做了详细说明。虽然它在许多方面与 NIO 的其余组成部分缺少平行关系,但它在文件处理等众多领域都是极其有用的。
java.nio.charsets 提供了新类用于处理字符与字节流之间的映射关系。 您能够对字符转换映射方式进行选择,也能够本身建立映射。