【Java NIO】那NIO为什么速度快?

Java IO在工作中其实不常用到,更别提NIO了。但NIO却是高效操作I/O流的必备技能,如顶级开源项目Kafka、Netty、RocketMQ等都采用了NIO技术,NIO也是大多数面试官必考的体系知识。虽然骨头有点难啃,但还是要慢慢消耗知识、学以致用哈~

🌱以贴近现实的【面试官面试】形式涵盖大部分Java程序员需要掌握的后端知识、面试问题,系列博客收录在我开源的JavaGetOffer中,会一直完善下去,希望收到大家的 ⭐️ Star ⭐️支持,这是我创作的最大动力: https://github.com/hdgaadd/JavaGetOffer

在这里插入图片描述

文章目录

    • 1. Java NIO
      • 1.1 通道和缓冲器
      • 1.2 非阻塞IO模型
      • 1.3 字符流处理字符?
    • 2. Channel和`Buffer`使用
      • 2.1 Buffer
      • 2.2 Channel
    • 3. NIO零拷贝
    • 未完待续。。。

1. Java NIO

面试官:了解过NIO吗?

了解的面试官。NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。

NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。

程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。

1.1 通道和缓冲器

面试官:那NIO为什么速度快?

是这样的,NIO提供了通道和缓冲器这两个核心对象。

(1)管道Channel

与传统的IO流只能只读或只写的单向流不同,NIO通道是双向的,也就是说读写操作可以同时进行,使得数据的处理效率也更高。

(2)缓冲器Buffer

传统的输入/输出流一次只处理一个字节,而每一次字节读取都是一次系统调用,涉及到用户空间和内核空间之间的上下文切换,通常来说效率不高。

NIO采用内存映射文件方式来处理输入/输出,Channel通过map()方法把一块数据映射到内存中。程序通过Buffer进行数据交互,减少了与原始数据源的直接访问。NIO面向块的处理方式使得效率更高。

1.2 非阻塞IO模型

面试官:还有吗?

有的。

传统的输入/输出流是同步阻塞IO模型,如果数据源没有数据了,此时程序将进行阻塞。

NIO是I/O多路复用模型,线程可以询问通道有没可用的数据,而不需要在没有数据时阻塞掉线程。

1.3 字符流处理字符?

面试官:你刚刚说输入/输出流是处理字节?字符流不是处理字符吗?

不是的。所有数据包括文本数据最终都是以字节形式存储的,因为计算机底层只能理解二进制数据。

字符最终也是要转换成字节形式,之所以可以在文本文件看到字符,是因为系统将底层的二进制序列转换成了字符。

2. Channel和Buffer使用

2.1 Buffer

面试官:你具体介绍下Buffer?

好的,Buffer里有3个关键变量

在这里插入图片描述

  1. capcity:表示缓冲器Buffer的最大数据容量。
  2. position:用来指出下一个可以读出/写入Buffer的索引位置,也就是记录指针的作用。
  3. limit:用来表示在Buffer里第一个不能被读出/写入的索引位置。

在这里插入图片描述

另外Buffer还提供了getput方法来供我们操作数据,而使用get/put后,position的指针位置也会随之移动。

public abstract byte get();public abstract ByteBuffer put(byte b);

2.2 Channel

面试官:Channel呢?

Channel有常见的3个方法,map()、read()和write()。

// 将通道文件的区域直接映射到字节缓冲区中
public abstract MappedByteBuffer map(MapMode mode, long position, long size)// 从此Channel通道读取字节序列到给定缓冲区dst
public abstract int read(ByteBuffer dst)// 将给定缓冲区中src的字节序列写入此Channel通道
public abstract int write(ByteBuffer src)

以下是Channel的简单使用代码。

public class TestFileChannel {public static void main(String[] args) {File f = new File("D:\\JavaGetOffer\\TestFileChannel.java");try {FileChannel inChannel = new FileInputStream(f).getChannel();FileChannel outChannel = new FileOutputStream("a.txt").getChannel();MappedByteBuffer buffer = inChannel.map(FileChannel.MapMode.READ_ONLY, 0, f.length());outChannel.write(buffer);buffer.clear();CharBuffer charBuffer = StandardCharsets.UTF_8.newDecoder().decode(buffer);System.out.println(charBuffer);} catch (IOException ex) {ex.printStackTrace();}}
}

3. NIO零拷贝

面试官:知道NIO零拷贝吗?

是这样的,在NIO零拷贝出现之前,一个I/O操作会将同一份数据进行多次拷贝。可以看下图,一次I/O操作对数据进行了四次复制,同时来伴随两次内核态和用户态的上下文切换,众所周知上下文切换是很耗费性能的操作。

在这里插入图片描述

而零拷贝技术改善了上述的问题。可以对比下图,零拷贝技术减少了对一份数据的拷贝次数,不再需要将数据在内核态和用户态之间进行拷贝,也意味不再进行上下文切换,让数据传输变得更加高效。

在这里插入图片描述

未完待续。。。

好了,今天的分享就先到这,我们下期《Java IO系列》继续。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

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

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

相关文章

PDF.js介绍以及使用

这里写目录标题 下载放入项目内加载pdf文件其他问题加载远程文件跨域中文语言 下载 官网地址 下载最新版浏览器版本。 放入项目内 我这是uniapp项目 放入了 static vue 项目可以放入public内 build 是源码库 web 内是写好的一个类似pdf编辑器的完整项目 加载pdf文件 // 组件…

ArcGIS三维景观分层显示

今天将向大家介绍的事在ArcGIS中如何创建多层三维显示。 地表为影像的 地表为地形晕渲的 在土壤分层、油气分层等都有着十分重要的应用。下面我们具体来看看实现过程 一、 准备数据及提取栅格范围 我们这次准备的数据是之前GIS100例-30讲的案例数据。《ArcGIS三维影像图剖面图…

LeetCode 每日一题 Day 123-136

1379. 找出克隆二叉树中的相同节点 给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 original 中的目标节点 target。 其中,克隆树 cloned 是原始树 original 的一个 副本 。 请找出在树 cloned 中,与 tar…

【静态分析】软件分析课程实验-前置准备

课程:南京大学的《软件分析》课程 平台:Tai-e(太阿)实验作业平台 1. 实验概述 Tai-e 是一个分析 Java 程序的静态程序分析框架,相比于已有的知名静态程序分析框架(如 Soot、Wala 等)&#xf…

女上司问我:误删除PG百万条数据,可以闪回吗?

作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验 擅长主流数据Oracle、MySQL、PG、openGauss运维 备份恢复,安装迁移,性能优化、故障应急处理等可提供技术业务: 1.DB故障处理/疑难杂症远程支援 2.Mysql/PG/Oracl…

字体反爬积累知识

目录 一、什么是字体反扒 二、Unicode编码 三、利用font包获取映射关系 一、什么是字体反扒 字体反爬是一种常见的反爬虫技术,它通过将网页中的文本内容转换为特殊的字体格式来防止爬虫程序直接获取和解析文本信息。字体反爬的原理是将常规的字符映射到特殊的字…

服务器数据恢复—xfs文件系统节点、目录项丢失的数据恢复案例

服务器数据恢复环境: EMC某型号存储,该存储内有一组由12块磁盘组建的raid5阵列,划分了两个lun。 服务器故障: 管理员为服务器重装操作系统后,发现服务器的磁盘分区发生改变,原来的sdc3分区丢失。由于该分区…

C++ | Leetcode C++题解之第31题下一个排列

题目&#xff1a; 题解&#xff1a; class Solution { public:void nextPermutation(vector<int>& nums) {int i nums.size() - 2;while (i > 0 && nums[i] > nums[i 1]) {i--;}if (i > 0) {int j nums.size() - 1;while (j > 0 && …

Keepalived+LVS+nginx搭建nginx高可用集群

一、简介 nginx是一款非常优秀的反向代理工具&#xff0c;支持请求分发&#xff0c;负载均衡&#xff0c;以及缓存等等非常实用的功能。在请求处理上&#xff0c;nginx采用的是epoll模型&#xff0c;这是一种基于事件监听的模型&#xff0c;因而其具备非常高效的请求处理效率…

笔试题1 -- 吃掉字符串中相邻的相同字符(点击消除_牛客网)

吃掉字符串中相邻的相同字符 文章目录 吃掉字符串中相邻的相同字符题目重现解法一&#xff1a;(基于 erase() 函数实现)解法二&#xff1a;&#xff08;利用 栈 辅助实现&#xff09;总结 题目链接&#xff1a; 点击消除_牛客网 题目重现 牛牛拿到了一个字符串。 他每次“点击…

msyql中SQL 错误 [1118] [42000]: Row size too large (> 8126)

场景&#xff1a; CREATE TABLE test-qd.eqtree (INSERT INTO test.eqtree (idocid VARCHAR(50) NULL,sfcode VARCHAR(50) NULL,sfname VARCHAR(50) NULL,sfengname VARCHAR(50) NULL,…… ) ENGINEInnoDB DEFAULT CHARSETutf8 COLLATEutf8_general_ci;或 alter table eqtre…

error: failed to push some refs to ‘https://gitee.com/zhao-zhimin12/gk.git‘

git push origin master发现以下报错: 解决办法: 一、强制推送 git push origin master -f &#xff08;加上 -f 就是强制&#xff09; 二、 先拉取最新代码&#xff0c;再推送 1.git pull origin master 2.git push origin master

两步解决 Flutter Your project requires a newer version of the Kotlin Gradle plugin

在开发Flutter项目的时候,遇到这个问题Flutter Your project requires a newer version of the Kotlin Gradle plugin 解决方案分两步: 1、在android/build.gradle里配置最新版本的kotlin 根据提示的kotlin官方网站搜到了Kotlin的最新版本是1.9.23,如下图所示: 同时在Ko…

腾讯云人脸服务开通详解:快速部署,畅享智能体验

请注意&#xff0c;在使用人脸识别服务时&#xff0c;需要确保遵守相关的法律法规和政策规定&#xff0c;保护用户的合法权益&#xff0c;并依法收集、使用、存储用户信息。此外&#xff0c;腾讯云每个月会提供一定次数的人脸识别调用机会&#xff0c;对于一般的小系统登录来说…

故障转移-redis

4.4.故障转移 集群初识状态是这样的&#xff1a; 其中7001、7002、7003都是master&#xff0c;我们计划让7002宕机。 4.4.1.自动故障转移 当集群中有一个master宕机会发生什么呢&#xff1f; 直接停止一个redis实例&#xff0c;例如7002&#xff1a; redis-cli -p 7002 sh…

pip如何查看Python某个包已发行所有版本号?

以matplotlib包为例子&#xff0c; pip install matplotlib6666 6666只是胡乱输入的一个数&#xff0c;反正输入任意一个不像版本号的数字都可以&#xff5e; matplotlib所有版本号如下&#xff0c; 0.86, 0.86.1, 0.86.2, 0.91.0, 0.91.1, 1.0.1, 1.1.0, 1.1.1, 1.2.0, 1.2.1…

盲人安全导航技巧:科技赋能让出行更自如

作为一名资深记者&#xff0c;长期关注并报道无障碍领域的发展动态。今日&#xff0c;我将聚焦盲人安全导航技巧&#xff0c;探讨这一主题下科技如何赋能视障人士实现更为安全、独立的出行。一款融合了实时避障、拍照识别物体及场景功能的盲人出行辅助应用叫做蝙蝠避障&#xf…

机器学习算法——决策树算法详细解读

决策树&#xff08;Decision Tree&#xff09;是在已知各种情况发生概率的基础上&#xff0c;通过构成决策树来求取净现值的期望值大于等于零的概率&#xff0c;评价项目风险&#xff0c;判断其可行性的决策分析方法&#xff0c;是直观运用概率分析的一种图解法。由于这种决策分…

Ansys在压力容器行业的典型应用(下)

压力容器热棘轮效应安定性分析 • 设计中的难点 ‐ 平均应力和交变载荷联合作用时&#xff0c;每次循环可能使容器产生一个不可逆的塑性应变增量&#xff0c;当塑性应变值递增至材料塑性被耗尽时&#xff0c;就会发生断裂。这种断裂与一般的疲劳破坏不同&#xff0c;一般的疲…

爱帮供应链邀您参观2024杭州快递物流供应链与技术装备展览会

2024年7月8-10日|杭州国际博览中心 同期举办&#xff1a;2024中国数字物流技术与应用展 2024国际电商物流包装产业展 2024新能源商用车、物流车展 展会介绍 本届展会致力于全面展示快递物流上下游领域的创新解决方案&#xff0c;涵盖快递物流供应链、智能装备、AGV机器人与…