李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
01.NIO简单介绍
Leefs
2022-05-23 PM
1270℃
0条
[TOC] ### 前言 **Java NIO有两种解释:** + 一种叫非阻塞IO(Non-blocking I/O) + 另一种叫新的IO(New I/O) 其实两种概念也是相同的。 ### 一、概述 Java NIO是从Java1.4版本开始引入的一个新的IO API,可以代替标准的IO API。 NIO与原来的IO有同样的作用和目的,但是使用的方式完全不同,**NIO支持面向缓冲区的,基于通道的IO操作**。NIO将以更加高效的方式进行文件的读写操作。 **NIO有三大核心部分** + **Channel(通道)** + **Buffer(缓冲区)** + **Selector(选择器)** ### 二、Java NIO与BIO的区别 + BIO以流的方式处理数据,而NIO以块的方式处理数据,块IO的效率比流IO高很多; + BIO是阻塞的,NIO则是非阻塞的; + BIO基于字节流和字符流进行操作,而NIO基于Channel(通道)和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道的事件(比如:连接请求,数据到达等),因此使用单个线程就可以监听多个客户端通道; + BIO是单向的,如:InputStream, OutputStream;而**NIO是双向的**,既可以用来进行读操作,又可以用来进行写操作。 ### 三、NIO三大核心原理 #### 3.1 Buffer(缓冲区) 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存,这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存,相比较直接对数组的操作,Buffer API更加容易操作和管理。 #### 3.2 Channel(通道) Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道。但流的(input或output)读写通常是单向的。通道可以非阻塞读取和写入通道,也可以支持读取或写入缓冲区,同时支持异步地读写。 **常见的 Channel 有** + FileChannel + DatagramChannel + SocketChannel + ServerSocketChannel #### 3.3 Selector(选择器) Selector是一个Java NIO组件,可以能够检查一个或多个NIO通道,并确定哪些通道已经准备好进行读取或写入。一个单独的线程可以管理多个channel,从而管理多个网络连接。 ![01.NIO简单介绍01.png](https://lilinchao.com/usr/uploads/2022/05/279987001.png) - 每个Channel都会对应一个Buffer - 一个线程对应Selector,一个Selector对应多个Channel(连接) - 程序切换到那个Channel是由事件决定的 - Selector会根据不同的事件,在各个通道上切换 - Buffer就是一个内存块,底层是一个数组 - 数据的读取写入是通过Buffer完成的,BIO中要么是输入流,或者是输出流,不能双向,但是NIO的Buffer时可以读也可以写 - Channel负责传输,Buffer负责存取数据 ### 四、缓冲区Buffer 一个用于特定基本数据类型的容器。由 Java NIO包定义的,所有缓冲区都是Buffer抽象类的子类。Java NIO中的Buffer主要用于与NIO通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的 ![01.NIO简单介绍02.png](https://lilinchao.com/usr/uploads/2022/05/665867991.png) #### Buffer类及其子类 Buffer就像一个数组,可以保存多个相同类型的数据。根据数据类型不同,有以下Buffer常用子类: - ByteBuffer * MappedByteBuffer * DirectByteBuffer * HeapByteBuffer - ShortBuffer - IntBuffer - LongBuffer - FloatBuffer - DoubleBuffer - CharBuffer 上述Buffer类 他们都采用相似的方法进行管理数据,只是各自管理的数据类型不同而已。都是通过如下方法获取一个Buffer对象: ```sql //创建一个容量为capacity的xxxBuffer对象 static xxxBuffer allocate(int capacity); | | | IntBuffer buffer = IntBuffer.allocate(10); ``` #### Buffer中的重要概念 - **容量(capacity):**创建后不能更改,且容量不能为负; - **限制(limit):**表示缓冲区中可以操作数据的大小。缓冲区的限制不能为负,并且不能大于其容量; 写入模式,限制等于buffer的容量。读取模式下,limit等于写入的数据量 - **位置(position):**下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制; - **标记(mark)与重置(reset):**标记是一个索引,通过Buffer中的mark()方法指定Buffer中一个特定的position,之后可以通过调用reset()方法恢复到这个position。 *附参考原文链接地址:* *https://www.cnblogs.com/LongDa666/p/14433408.html*
标签:
Netty
,
NIO
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/2074.html
上一篇
13.ClickHouse之MaterializeMySQL引擎
下一篇
02.NIO之bytebuffer基本使用
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
BurpSuite
HDFS
ajax
排序
并发线程
LeetCode刷题
SpringCloudAlibaba
Flink
Flume
JavaScript
Nacos
Http
Hbase
Typora
随笔
并发编程
Stream流
Jquery
Java
Hive
nginx
DataWarehouse
Python
Livy
二叉树
Golang基础
pytorch
Filter
NIO
Quartz
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭