java.nio的描述
发布时间:2025-05-25 02:38:57 发布人:远客网络
一、java.nio的描述
1、定义作为数据容器的缓冲区,并提供其他 NIO包的概述。
2、字符集及其相关解码器和编码器,
3、它们在字节和 Unicode字符之间进行转换;
4、各种类型的通道,它们表示到能够执行 IO操作的
5、实体的连接;以及选择器和选择键,它们与
6、可选择信道一起定义了多路的、无阻塞的
7、java.nio包定义了缓冲区类,这些类用于所有 NIO API。java.nio.charset包中定义了字符集API,java.nio.channels包中定义了信道和选择器 API。每个子包都具有自己的服务提供程序接口(SPI)子包,SPI子包的内容可用于扩展平台的默认实现或构造替代实现。
8、ByteBuffer Get/put,压缩,查看;分配,包装
9、MappedByteBuffer映射到文件的字节缓冲区
10、CharBuffer Get/put,压缩;分配,包装
11、ByteOrder字节顺序的类型安全的枚举
二、Java NIO与IO的区别和比较
1.NIO的创建目的是为了让 Java程序员可以实现高速 I/O而无需编写自定义的本机代码。NIO将最耗时的 I/O操作(即填充和提取缓冲区)转移回操作系统,因而可以极大地提高速度。传统的IO操作属于阻塞型,严重影响程序的运行速度。
2,。流与块的比较。原来的 I/O库(在 java.io.*中)与 NIO最重要的区别是数据打包和传输的方式。正如前面提到的,原来的 I/O以流的方式处理数据,而 NIO以块的方式处理数据。
面向流的 I/O系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的 I/O通常相当慢。
3.一个面向块的 I/O系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O缺少一些面向流的 I/O所具有的优雅性和简单性。
三、netty 和 java nio 的区别
Java NIO框架MINA用netty性能和链接数、并发等压力测试参数好于mina。
NIO弥补了原来的I/O的不足,它再标准java代码中提供了高速和面向块的I/O
原力的I/O库与NIO最重要的区别是数据打包和传输方式的不同,原来的I/O以流的方式处理数据,而NIO以块的方式处理数据;
NIO以通道channel和缓冲区Buffer为基础来实现面向块的IO数据处理,MINA是开源的。
JavaNIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内容,如果没有内容进来,read()也是傻傻的等,这会影响我们程序继续做其他事情,那么改进做法就是开设线程,让线程去等待,但是这样做也是相当耗费资源的。
Java NIO非堵塞技术实际是采取Reactor模式,或者说是Observer模式为我们监察I/O端口,如果有内容进来,会自动通知我们,这样,我们就不必开启多个线程死等,从外界看,实现了流畅的I/O读写,不堵塞了。
Java NIO出现不只是一个技术性能的提高,会发现网络上到处在介绍它,因为它具有里程碑意义,从JDK1.4开始,Java开始提高性能相关的功能,从而使得Java在底层或者并行分布式计算等操作上已经可以和C或Perl等语言并驾齐驱。
如果至今还是在怀疑Java的性能,说明思想和观念已经完全落伍了,Java一两年就应该用新的名词来定义。从JDK1.5开始又要提供关于线程、并发等新性能的支持,Java应用在游戏等适时领域方面的机会已经成熟,Java在稳定自己中间件地位后,开始蚕食传统C的领域。
NIO有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知socketchannel告诉Selector,我们接着做别的事情,当有事件发生时,他会通知我们,传回一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的socketchannel,然后,我们从这个Channel中读取数据,放心,包准能够读到,接着我们可以处理这些数据。Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个channel有所注册的事情发生。比如数据来了,他就会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个channel的内容。在使用上,也在分两个方向,一个是线程处理,一个是用非线程,后者比较简单。