Java-IO:浅谈对NIO的认识

Java-IO:简述常见的IO模型
Java-IO:浅谈对IO的认识

NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO 主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。

一、NIO的核心概念

NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区),Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。NIO和传统IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。
在这里插入图片描述

1、Channel

首先说一下Channel,国内大多翻译成“通道”。Channel和IO中的Stream(流)是差不多一个等级的。只不过Stream是单向的,譬如:InputStream,OutputStream,而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。NIO中的Channel的主要实现有:FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel;分别对应文件IO、UDP和TCP(Server和Client)。

2、Buffer

Buffer,故名思意,缓冲区,实际上是一个容器,是一个连续数组。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。

上面的图描述了从一个客户端向服务端发送数据,然后服务端接收数据的过程。客户端发送数据时,必须先将数据存入Buffer中,然后将Buffer中的内容写入通道。服务端这边接收数据必须通过Channel将数据读入到Buffer中,然后再从Buffer中取出数据来处理。

在NIO中,Buffer是一个顶层父类,它是一个抽象类,常用的Buffer的子类有:ByteBuffer、IntBuffer、CharBuffer、LongBuffer、DoubleBuffer、FloatBuffer、ShortBuffer

3、Selector

Selector类是NIO的核心类,Selector能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。

二、NIO的缓冲区

JavaIO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。

NIO的缓冲导向方法不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

三、NIO的非阻塞

IO的各种流是阻塞的。这意味着,当一个线程调用read()或write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。

NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/417417.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW如何自学成为专业开发者

自学成为LabVIEW专业开发者需要一个系统化的学习和实践过程,以下是一些关键步骤: 1. 扎实的基础学习 了解LabVIEW的基础概念:首先要熟悉LabVIEW的基本操作、数据流编程理念和图形化编程环境。可以通过LabVIEW的官方教程、Bilibili上的视频课程…

Github 2024-09-02 开源项目周报 Top13

根据Github Trendings的统计,本周(2024-09-02统计)共有13个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3TypeScript项目3Vue项目2Rust项目2Go项目2Dart项目1Jupyter Notebook项目1Shell项目1Dockerfile项目1PHP项目1Blade项目1AI.AppFlow…

Matlab三维图的坐标轴标签 自动平行坐标/自动旋转

下载解压工具包: https://www.mathworks.com/matlabcentral/fileexchange/49542-phymhan-matlab-axis-label-alignment 添加至MATLAB路径: 在三维绘图后增加下列语句即可 ax struct(Axes, gca); align_axislabel([],ax) h3d rotate3d; set(h3d,ActionPreCa…

认识正则表达式

为什么要学习正则表达式 因为爬虫需要!!! 一般来说爬虫需要四个主要步骤: 明确目标 (要知道你准备在哪个范围或者网站去搜索)爬 (将所有的网站的内容全部爬下来)取 (去掉对我们没用处的数据)处理数据(按照我们想要的方…

在Centos中的mysql的备份与恢复

1.物理备份 冷备份:关闭数据库时进行热备份:数据库运行时进行,依赖于数据库日志文件温备份:数据库不可写入但可读的状态下进行 2.逻辑备份 对数据库的表或者对象进行备份 3.备份策略 完全备份:每次都备份完整的数…

使用C语言实现字符推箱子游戏

使用C语言实现字符推箱子游戏 推箱子(Sokoban)是一款经典的益智游戏,玩家通过移动角色将箱子推到目标位置。本文将带你一步步用C语言实现一个简单的字符版本的推箱子游戏。 游戏规则 玩家只能推箱子,不能拉箱子。只能将箱子推到…

Unity界面、组件以及脚本

Unity界面 菜单栏 菜单栏:位于屏幕顶部,包含文件、编辑、资产、游戏对象、组件、地形、动画、图形、AI、窗口、工具和帮助等菜单项。 工具栏 工具栏:位于菜单栏下方,提供了快速访问常用功能的按钮,如播放、暂停、停止…

OpenGL/GLUT实践:实现反弹运动的三角形动画与键盘控制(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 运行效果2 实验过程2.1 环境配置2.2 绘制三角形2.2.1 渲染函数2.2.2 主函数2.2.3 运行结果 2.3 调整窗口大小2.4 简单动画与按键控制2.4.1 简单旋转2.4.2 键盘控制 2.5 窗口反弹动画2.5.1 处理窗口大小变化2.5.2 渲染函数…

c++修炼之路之C++11

目录 一:使用列表初始化 二:decltype和nullptr 三:右值引用和移动语义 四:新的类功能 五:可变参数模板 六:lambda表达式 七:包装器 1.function包装器 2.bind包装器 接下来的日子会顺…

Linux CentOS 部署Docker

1. yum 配置 (1)更新yum yum update -y 如果不升级更新yum 可能在后续docker部署后再更新容器会出现oci runtime error等 (2)安装yum工具类准备 yum install -y yum-utils device-mapper-persistent-data lvm2 (3&…

【操作系统存储篇】Linux文件基本操作

目录 一、Linux目录 二、Linux文件的常用操作 三、Linux文件类型 一、Linux目录 Linux有很多目录,Linux一切皆是文件,包括进程、设备等。 相对路径:相对于当前的操作目录,文件位于哪个目录。 绝对路径 :从根目录开…

Golang | Leetcode Golang题解之第387题字符串中的第一个唯一字符

题目: 题解: type pair struct {ch bytepos int }func firstUniqChar(s string) int {n : len(s)pos : [26]int{}for i : range pos[:] {pos[i] n}q : []pair{}for i : range s {ch : s[i] - aif pos[ch] n {pos[ch] iq append(q, pair{ch, i})} e…

数仓工具—Hive语法之URL 函数

hive—语法—URL 函数 业务需求中,我们经常需要对用户的访问、用户的来源进行分析,用于支持运营和决策。例如我们经常对用户访问的页面进行统计分析,分析热门受访页面的Top10,观察大部分用户最喜欢的访问最多的页面等: 又或者我们需要分析不同搜索平台的用户来源分析,统…

jmeter同步定时器、固定定时器、统一随机定时器、常数吞吐量定时器详解

一、同步定时器 可以让多个线程同时向服务器发送请求,实现瞬间并发(相当于现实中同步秒杀商品)类似于集合点 例如:10个人约定去旅游,出发前提前会在某一个地方等到10个人同时都到了约定地点之后再一同排队上车 在任意接口下添加同步定时器模…

区域智慧农业解决方案

### 1. 项目概述 《区域智慧农业整体解决方案》由左岸芯慧提出,旨在通过数字化手段打造新型农业经营管理方式,实现产销一体化。 ### 2. 农业监管与需求分析 方案针对监管部门、消费者和生产服务企业的需求进行分析,指出农业监管包括数据收…

【SpringBoot】使用Redis

目录 0. 安装Redis 1. 导入依赖 2. 配置Redis 3. idea连接Redis 4. 使用Redis简单实现记录访问次数 1. 配置拦截器 2. 定义拦截器 3. 控制器类 0. 安装Redis 我使用的是本地Redis服务器&#xff0c;安装过程。安装完成后启动Redis服务。 1. 导入依赖 <!-- red…

负载均衡调度器--LVS

文章目录 集群和分布式集群分布式 LVS介绍LVS特点LVS工作原理LVS集群架构 LVS集群中的术语CIPVIPRSDIPRIP LVS集群的工作模式NAT模式DR模式DR模式的特点: TUN模式 LVS调度算法LVS相关软件ipvsadm 命令管理集群服务&#xff1a;增、改、删管理集群上的RS:增、改、删 创建集群 LV…

如何修复软件中的BUG

笔者上一篇博文《如何开发出一款优秀的软件》主要讲了如何开发一款优秀的软件及相应的必要条件。但对一个已上线&#xff0c;已经成型的产品&#xff0c;该如何解决存在的bug呢&#xff1f;这是本文要阐述的内容。 在这里&#xff0c;首先说一下bug的种类及bug严重程度分类&…

微信小程序认证和备案

小程序备案的流程一般包括以下步骤‌&#xff1a; 准备备案所需材料‌&#xff1a;通常需要提供‌营业执照、法人的‌身份证、两个‌手机号和一个邮箱等资料。 ‌1 ‌登录‌微信公众平台‌&#xff1a;作为第一次开发微信小程序的服务商&#xff0c;需要通过微信公众平台申请…

AAC高级音频编码技术

一、什么是AAC AAC的中文名称是高级音频编码技术&#xff0c;它是基于MPEG-2的一种全新的音频编码技术。随着时代的发展&#xff0c;目前AAC的技术升级到MPEG-4表准。AAC广泛的应用在网络传输、高清录制等领域&#xff0c;而AAC技术的出现就是为了取代之前的MP3格式。 二、为什…