【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.mzph.cn/news/821985.shtml

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

相关文章

# RAG | Langchain # Langchain RAG:打造Markdown文件的结构化分割解决方案

【文章简介】 在信息技术的现代背景下,高效地处理和分析文本数据对于知识获取和决策支持至关重要。Markdown文件因其易读性和高效性,在文档编写和知识共享中占据了重要地位。然而,传统的文本处理方法往往忽视了Markdown的结构化特性&#xff…

KNIME 国际化支持投票

你的投票也许能让 KNIME 中文化快一点点。 i18n 是个很搞笑的单词,它是英文 internationalization 国际化的缩写。18 指的是首字母i和末字母n中间有18个字母。另外还有什么 K8s 也是一样,中间省去了8个字母 ... 真是懒的可以。指北君还想起一个类似的笑话…

数字革命的先锋:Web3对社会的影响

引言 在信息技术飞速发展的当下,Web3作为一个新兴的互联网模式,正在逐渐改变我们的生活方式、商业模式和社会结构。本文将深入探讨Web3的核心特点、它在各个领域中的应用以及对社会产生的深远影响。 1. Web3的核心特点 1.1 去中心化 Web3强调去中心化…

记【k8s】:访问 Prometheus UI界面:kubernetes-etcd (0/1 up) Error : out of bounds

记【k8s】:访问 Prometheus UI界面:kubernetes-etcd (0/1 up) Error : out of bounds 1、报错详情2、解决方法 💖The Begin💖点点关注,收藏不迷路💖 出现 “out of bound…

Synchronized锁详解(全网最细)

目录 以下知识基于HotSpot虚拟机实现 1.前置知识 1.1 锁的作用 1.2 Java中常见的锁类型 1.3 锁的重入 2.使用场景 2.1 修饰实例方法 2.1.1 用法 2.1.2 原理 2.1.3 特点 2.2 修饰静态方法 2.2.1 用法 2.2.2 原理 2.3 修饰代码块 2.3.1 用法 3.原理 3.1 对象锁 …

数字电路(四,五章总结)

四.组合逻辑电路设计 由波形图列真值表,之 后画出卡诺图,写出最简逻辑表达式。 卡诺图化简的时候圈住的部分如果某个字母有0又有1的话这个字母删掉,写出其他两个字母。 如下图中黄圈A有0又有1则删除A,这样黄圈代表BC;同理绿圈代…

SpringBoot项目基于java的教学辅助平台

采用技术 SpringBoot项目基于java的教学辅助平台的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBootMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 页面展示效果 学生信息管理 教师信息管理 课程信息管理 科目分类管…

Pytorch入门实战 P06-调用vgg16模型,进行人脸预测

目录 1、本文内容: 1、内容: 2、简单介绍下VGG16: 3、相关其他模型也可以调用: 2、代码展示: 3、训练结果: 1、不同优化器: ①【使用SGD优化器】 ②【使用Adam优化器】 ③Adam 动态学…

(BERT蒸馏)TinyBERT: Distilling BERT for Natural Language Understanding

文章链接:https://arxiv.org/abs/1909.10351 背景 在自然语言处理(NLP)领域,预训练语言模型(如BERT)通过大规模的数据训练,已在多种NLP任务中取得了卓越的性能。尽管BERT模型在语言理解和生成…

深度学习 Lecture 7 迁移学习、精确率、召回率和F1评分

一、迁移学习(Transfer learning) 用来自不同任务的数据来帮助我解决当前任务。 场景:比如现在我想要识别从0到9度手写数字,但是我没有那么多手写数字的带标签数据。我可以找到一个很大的数据集,比如有一百万张图片的猫、狗、汽…

论文笔记:(INTHE)WILDCHAT:570K CHATGPT INTERACTION LOGS IN THE WILD

iclr 2024 spotlight reviewer 评分 5668 1 intro 由大型语言模型驱动的对话代理(ChatGPT,Claude 2,Bard,Bing Chat) 他们的开发流程通常包括三个主要阶段 预训练语言模型在被称为“指令调优”数据集上进行微调&…

JDK5.0新特性

目录 1、JDK5特性 1.1、静态导入 1.2 增强for循环 1.3 可变参数 1.4 自动装箱/拆箱 1.4.1 基本数据类型包装类 1.5 枚举类 1.6 泛型 1.6.1 泛型方法 1.6.2 泛型类 1.6.3 泛型接口 1.6.4 泛型通配符 1、JDK5特性 JDK5中新增了很多新的java特性,利用这些新…

v-for中涉及的key

一、为什么要用key? key可以标识列表中每个元素的唯一性,方便Vue高效地更新虚拟DOM;key主要用于dom diff算法,diff算法是同级比较,比较当前标签上的key和标签名,如果都一样,就只移动元素&#…

【刷题笔记】第七天

文章目录 [924. 尽量减少恶意软件的传播](https://leetcode.cn/problems/minimize-malware-spread/)方法一,并查集方法二,dfs [GCD and LCM ](https://vjudge.net.cn/problem/HDU-4497#authorKING_LRL) 924. 尽量减少恶意软件的传播 如果移除一个感染节…

上海计算机学会 2023年10月月赛 乙组T4 树的覆盖(树、最小点覆盖、树形dp)

第四题:T4树的覆盖 标签:树、最小点覆盖、树形 d p dp dp题意:求树的最小点覆盖集的大小和对应的数量,数量对 1 , 000 , 000 , 007 1,000,000,007 1,000,000,007取余数。所谓覆盖集,是该树的点构成的集合,…

docker 环境变量设置实现方式

1、前言 docker在当前运用的越来广泛,很多应用或者很多中间软件都有很多docker镜像资源,运行docker run 启动镜像资源即可应用。但是很多应用或者中间件有很多配置参数。这些参数在运用过程怎么设置给docker 容器呢?下面介绍几种方式 2 、do…

无线网络安全之WiFi Pineapple初探

背景 WiFi Pineapple(大菠萝)是由国外无线安全审计公司Hak5开发并售卖的一款无线安全测试神器。集合了一些功能强大的模块,基本可以还原钓鱼攻击的全过程。在学习无线安全时也是一个不错的工具,本文主要讲WiFi Pineapple基础配置…

和鲸科技将参与第五届空间数据智能学术会议并于应急减灾与可持续发展专题论坛做报告分享

ACM SIGSPATIAL中国分会致力于推动空间数据的研究范式及空间智能理论与技术在时空大数据、智慧城市、交通科学、社会治理等领域的创新与应用。ACM SIGSPATIAL中国分会创办了空间数据智能学术会议(SpatialDI),分会将于2024年4月25日-27日在南京…

javaWeb项目-快捷酒店管理系统功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、Spring Boot框架 …

PSCAD|应用于输电线路故障测距的行波波速仿真分析

1 主要内容 该程序参考文献《应用于输电线路故障测距的行波波速仿真分析》,利用线路内部故障产生的初始行波浪涌达线路两端测量点的绝对时间之差值计算故障点到两端测量点之间的距离,并利用小波变换得到初始行波波头准确到达时刻,从而精准定…