前言:
Jdk自1.4版本开始,提供给我们一种新的IO操作,即NIO(new io),这种新的io不同与之前的io操作(java.io包
下),感觉是个废话。我们称java.io包下的io为BIO(blocking io)。Jdk1.7版本开始,又给我们提供了第三招IO操
作,即AIO(asynchronous io),之所以有不同这么io,原因取决于底层(操作系统)的区别,具体的区别参阅”系
统的几种IO模型”。这篇文章介绍我对nio的掌握理解。
Nio包总体结构了解:
Java.nio包
Java.nio.channel包
我们知道java程序跑在jvm上,sun公司向下屏蔽了底层的具体操作,向上为我们提供了抽象的形象的api,
方便我们使用,nio抽象的还原了底层进行io操作的情况,又使我们开发人员便于理解学习。
理解nio:
我们知道,跑在操作系统上的程序,当程序发生与硬件相关的操作时,并非我们的程序直接与硬件交
互,都是程序调用操作系统函数,操作系统再去与具体的硬件交互的。这也是IO的操作基本流程。Java
程序也不例外,现在就来看看javanio是如何进行操作的:
Nio是基于通道+缓冲器来抽象应用程序io操作的
通道(Channel):很好理解。道路,走廊等等,都可认为是通道,即起始点间打通,能够传输的。
计算机中可认为是程序(内存)到操作系统,再到外部介质(磁盘,网络等)的能够传
输数据的通道,理解起来是不是不难,光有通道也不行,得有东西在上面传递。
缓冲器(Buffer):这就是数据的存储器,我们知道真正的IO操作不是程序本身去做,而是由操作
系统去实现,程序只是把数据准备好,然后向操作发送读或写信号,系统就将
程序准备的数据进行读写,而程序准备的数据就放在缓冲器中。
Nio主要就是这两个核心概念。下面再具体看看nio的api。.
API介绍:
通过上面的关系图,可以看出来,根据终点的不同,可以分成大致如下几种通道:
DatagramChannel:数据报套接字通道(UDP网络)
ServerSocketChannel:侦听套接字通道
SocketChannel:连接套接字通道
Pipe.SinkChannel:管道传送的通道(可写入)
Pipe.SourceChannel:管道传送的通道(可读取)
FileChannel:文件通道
方法介绍:读写方法每个通道都有,同时需要将缓冲器最为参数放进去(注意,仅仅是一个系统调用,
具体由系统去做;其次不同于bio的是,通道是双向的,可读可写),方法请参看这里。
接下来,看看缓冲器,通过上图看出可分为:
ByteBuffer:字节缓存器
CharBuffer :字符缓冲
DoubleBuffer :double 缓冲区器
FloatBuffer :float 缓冲区
IntBuffer :int缓冲器
LongBuffer :long缓冲器
MappedByteBuffer :直接字节缓冲区(内容是文件的内存映射区域)
ShortBuffer:short缓冲器
ByteOrder:字节序的类型安全枚举(即大小端)
通过上面介绍基本对nio有了较全面的了解了,先脉络后细节,我们先要有个宏观上的把握,这样学习
具体的才能便于理解和记忆。这里还有个小的知识点(也就是java.nio.charset 包),没介绍,接下来就看
看java.nio.charset包。
java.nio.charset包:
根据包名也就知道是干什么的了,字符集的问题。这个其实可以类比bio,在bio中,当在非字节流的操作
情况下,我们都需要指定一个字符集来读,写流,这样才能保证不会出现乱码的现象。java.nio.charset
包也就是nio中进行读,写到通道时指定的字符集。
主要有3个类:
Charset :提供解码,编码;Unicode 代码单元序列和字节序列之间的指定映射关系的类。
CharsetDecoder :解码器,用于将字节序列转换成 16 位 Unicode 字符序列。
CharsetEncoder :编码器,用于将Unicode 字符序列转成 charset 中字节序列。
在nio中放进通道的缓冲器只能为ByteBuffer(字节缓冲器),所以程序中使用了字符等其他的缓冲器时,
当进行读写,要先转成字节缓冲器。
下一篇文章会根据一个简单代码了解如何使用nio的相关api。
相关推荐
**NIO系列DATASHEET.pdf**提供了NIO系列产品的详细介绍和技术规格,该文档覆盖了多个型号的产品,包括不同类型的输入输出模块、电源设备以及网络连接设备等。下面将详细解析文档中的各个模块及其特点。 #### 二、...
"滑模变结构控制理论进展综述.pdf" 这个文件很可能详细介绍了滑模控制理论的最新研究进展、应用实例以及与正泰NIO1系列变频器相关的控制技术。通过阅读这份综述,我们可以深入理解滑模控制在实际工程中的应用,包括...
### Java NIO 系列教程(一):Java NIO 概述 #### 一、引言 Java NIO(New IO)是Java SE 1.4版本引入的一个新的I/O处理框架,它提供了比传统Java IO包更高效的数据处理方式。NIO的核心在于其三大组件:Channels...
- **NIO (New IO)**:随着JDK 1.4的发布,Java引入了一种全新的IO处理方式——NIO,它提供了一系列新特性和改进,以提高IO效率。 NIO的关键特性包括但不限于: - **缓存(Buffer)支持**:为所有的原始类型提供缓存...
通过以上介绍,我们可以了解到 Java NIO 提供了一系列强大而灵活的 API 来处理 I/O 操作,相比于传统的 Java IO,它在性能和灵活性方面都有显著提升。后续章节将深入探讨这些核心组件的具体使用方法和高级特性。
1. **通道(Channels)**:通道是数据传输的途径,类似于BIO中的流。Java NIO提供了多种通道,如文件通道(FileChannel)、套接字通道(SocketChannel)和服务器套接字通道(ServerSocketChannel)等。通道可以进行...
本文将详细介绍一种基于事件驱动的NIO多线程服务器的设计思路与实现原理。 #### NIO多线程服务器的关键概念 ##### 1. NIO与多线程结合的意义 - **提高资源利用率**:多线程能够充分利用多核CPU的计算能力,尤其是...
通过以上介绍,我们可以看到NIO相比于传统的I/O技术,在数据处理效率上有显著的提升。通过使用缓冲区和通道的概念,NIO能够更加高效地处理数据,特别适合于需要大量数据处理的应用场景。此外,NIO还提供了一系列高级...
根据提供的文件信息,“Pro Java 7 NIO.2.pdf”由Anghel Leonard于2011年编写,主要介绍了Java 7中的新输入/输出(NIO)API,特别是NIO.2(JSR 203)所带来的增强功能。这本书通过一系列章节详细讲解了如何使用NIO.2...
### 1. Path路径 `java.nio.file.Paths`模块提供静态方法创建`Path`对象,代表文件系统中的路径。`Path`类则包含一系列方法,用于处理和操作路径。例如: ```java import java.nio.file.Path; import java.nio....
本文档通过对NIO库的详细介绍,旨在帮助Java开发者更好地理解和掌握NIO的核心概念和技术细节。通过学习缓冲区、通道和选择器等关键组件的使用方法,开发者可以编写出更加高效、可靠的Java应用程序。同时,NIO库还...
本文将详细介绍NIO的主要组成部分及其实现原理,帮助开发者更好地理解和应用NIO技术。 #### 二、NIO API概述 NIO API主要集中在`java.nio`及其子包中: 1. **`java.nio`**: 定义了各种类型的缓冲区(Buffer),包括...
- **基本类型**:NIO提供了一系列缓冲区类,如`ByteBuffer`、`CharBuffer`、`IntBuffer`等,它们分别用于存储不同类型的数据。 - **状态管理**:缓冲区有四个关键状态:容量(Capacity)、限制(Limit)、位置...