Java NIO 学习:概述

  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 服务。

  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 软件包,同时现存软件包也相应作了几处修改。

  以下概要,是专门为那些迫不及待往前赶的人准备的。

缓冲区( Buffers

  新的 Buffer 类是常规 Java 类和通道之间的纽带。原始数据元素组成的固定长度数组,封装在包含状态信息的对象中,存入缓冲区。缓冲区提供了一个会合点:通道既可提取放在缓冲区中的数据(写),也可向缓冲区存入数据供读取(读)。此外,还有一种特殊类型的缓冲区,用于内存映射文件。

通道( Channels

  NIO 新引入的最重要的抽象是通道的概念。 Channel 对象模拟了通信连接,管道既可以是单向的(进或出),也可以是双向的(进和出)。可以把通道想象成连接缓冲区和 I/O 服务的捷径。某些情况下,软件包中的旧类可利用通道。为了能够向与文件或套接字关联的通道进行存取,适当的地方都增加了新方法。多数通道可工作在非块模式下,这意味着更好的可伸缩性,尤其是与选择器一同使用的时候。

文件锁定和内存映射文件( File locking and memory-mapped files

  新的 FileChannel 对象包含在 java.nio.channels 软件包内,提供许多面向文件的新特性,其中最有趣的两个是文件锁定和内存映射文件。在多个进程协同工作的情况下,要协调各个进程对共享数据的访问,文件锁定是必不可少的工具。将文件映射到内存,这样在您看来,磁盘上的文件数据就像是在内存中一样。这利用了操作系统的虚拟内存功能,无需在内存中实际保留一份文件的拷贝,就可实现文件内容的动态高速缓存。

套接字( Sockets

  套接字通道类为使用网络套接字实现交互提供了新方法。套接字通道可工作于非块模式,并可与选择器一同使用。因此,多个套接字可实现多路传输,管理效率也比 java.net 提供的传统套接字更高。三个新套接字通道,即 ServerSocketChannelSocketChannel DatagramChannel。

选择器( Selectors

  选择器可实现就绪性选择。 Selector 类提供了确定一或多个通道当前状态的机制。使用选择器,借助单一线程,就可对数量庞大的活动 I/O 通道实施监控和维护。

正则表达式( Regular expressions

  新增的 java.util.regex 软件包将类似 Perl 语言的正则表达式处理机制引入 Java。这一人们期盼已久的特性有着广泛用途。新的正则表达式 API 之所以被看成是 NIO 的组成部分,是因 JSR 51 把它与其他 NIO 特性放在一起作了详细说明。虽然它在许多方面与 NIO 的其他组成部分缺乏平行关系,但它在文件处理等众多领域都是极其有用的。

字符集( Character sets

  java.nio.charsets 提供了新类用于处理字符与字节流之间的映射关系。 您可以对字符转换映射方式进行选择,也可以自己创建映射。

转载于:https://my.oschina.net/HerrySun/blog/727437

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值