Netty实战专栏 | JavaIO演进之路

news2025/2/22 21:28:39

在这里插入图片描述

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏: Netty实战专栏
✨特色专栏: MySQL学习
🥭本文内容: Netty实战专栏 | JavaIO演进之路
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: Leo知识库,欢迎大家访问

目录

    • 1.前言
    • 2.早期的JavaIO
    • 3.引入NIO
    • 4.引入NIO.2(Java7)
    • 5.引入流式API(Java8)
    • 6.I/O模型基本说明
    • 7.I/O模型
      • 7.1Java BIO
      • 7.2Java NIO
      • 7.3Java AIO
    • 8.BIO、NIO、AIO适用场景分析
    • 9.总结

学习参考 :

  • 讲师:孙帅老师
  • 课程:孙哥说netty

1.前言

大家好,我是Leo哥🫣🫣🫣,上一篇博客我们主要了解了Java网络编程的相关内容,通过对网络编程的一些了解,有助于我们学习接下来的知识点。在此之前,这一篇我想讲讲关于Java整个IO的演变历程,Java到底是怎样一步一步从基础IO操作到最后的AIO演变。好了,话不多说让我们开始吧😎😎😎。

2.早期的JavaIO

在Java早期版本中,主要使用java.io包来进行输入和输出操作。其中,最常用的类是InputStreamOutputStream。这些类提供了基本的字节流操作方法,如read()write(),用于读取和写入字节数据。 虽然早期的Java IO已经非常实用,但它存在一些问题。

首先,它过于底层,需要开发者自己处理缓冲、字符编码等细节。其次,它是阻塞式IO,即在进行IO操作时,程序会被阻塞,直到操作完成。这种阻塞模型在某些情况下可能导致性能问题。

3.引入NIO

为了解决早期Java IO的问题,Java 1.4版本引入了NIO(New IO)库,也就是java.nio包。NIO提供了更高级、更灵活的IO功能。 NIO的核心组件是通道(Channel)缓冲区(Buffer)。通过使用通道,可以实现非阻塞式IO操作。缓冲区提供了更高效的数据读写方式。

此外,NIO还引入了选择器(Selector)来管理多个通道的IO事件。 相对于早期的Java IO,NIO具有许多优点。它支持异步IO操作,允许程序在等待IO操作完成时继续执行其他任务,提高了系统的并发性能。此外,NIO提供了更灵活的字符集编码支持,使得处理不同字符编码的数据更加方便。

然而,NIO的使用复杂度较高,需要开发者编写更多的代码来实现相同的功能。因此,在实际开发中,NIO的应用范围相对有限。

4.引入NIO.2(Java7)

为了进一步改进Java IO的功能,Java 7引入了NIO.2,也就是java.nio.file包。NIO.2提供了更高级、更易用的文件和目录操作功能。 NIO.2引入了Path类,用于表示文件或目录的路径。它提供了一系列的方法来进行文件的创建、删除、复制、移动等操作。此外,NIO.2还引入了WatchService接口,用于监视文件系统的变化。

相比于早期的Java IO,NIO.2简化了文件和目录操作的代码编写,并提供了更多的功能和灵活性。它使得Java在文件和目录处理方面与操作系统更加接近。

5.引入流式API(Java8)

为了进一步简化IO操作,并提供更流畅的代码编写体验,Java 8引入了流式API(Stream API)。流式API是基于函数式编程风格的API,可以通过链式调用来进行数据处理。 流式API主要用于处理集合、数组等数据源的数据。它提供了丰富的中间操作和终端操作,如过滤、映射、排序、归约等。通过使用流式API,开发者可以编写更简洁、可读性更高的代码。

流式API在某些情况下可以替代早期的Java IO和NIO操作,使得代码更加简洁和易读。同时,它也提供了并行处理的能力,可以充分利用多核处理器的性能优势。

在2023年作为一个合格的Java程序员,Java流式编程是必不可少的,它不仅能用来装13,主要是的是能让你的代码更加优雅可读。对于Java流式编程还不太了解的,可以参考我这第一篇博客。

6.I/O模型基本说明

I/O模型:就是用什么样的通道或者说是通信模式和架构进行数据的传输和接收,很大程度上决定了程序通信的性能 , Java共支持3种网络编程的I/O模型:BlO. NIO. AlO

实际通信需求下,要根据不同的业务场景和性能需求决定选择不同的I/O模型

7.I/O模型

7.1Java BIO

同步阻塞(传统阻塞型),同步阻塞 IO 模型中,应用程序发起 read 调用后,会一直阻塞,直到内核把数据拷贝到用户空间。

image-20231103112026730

7.2Java NIO

Java NIO:同步非阻塞,同步非阻塞 IO 模型中,应用程序会一直发起 read 调用,等待数据从内核空间拷贝到用户空间的这段时间里,线程依然是阻塞的,直到在内核把数据拷贝到用户空间。

相比于同步阻塞 IO 模型,同步非阻塞 IO 模型确实有了很大改进。通过轮询操作,避免了一直阻塞。

image-20231103112117328

7.3Java AIO

java AIO(NIO.2):异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完 成了再通知服务器应用去启动线程进行处理,一般适用于连接数较多且连接时间较长的应用

8.BIO、NIO、AIO适用场景分析

  1. BIO方式适用于连接数目比小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中, jDK1.4以前的唯一选择,但程序简单易理解。
  2. NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,弹幕系统,服务器间通讯等。 编程比较复杂,jDK1 .4开始支持。
  3. AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作, 编程比较复杂,JDK7开始支持。

9.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

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

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

相关文章

性能优于BERT的FLAIR:一篇文章入门Flair模型

文章目录 What is FLAIR?FLAIR ModelContextual String Embedding for Sequence Labelingexample FLAIR Application AreaSentiment AnalysisNamed Entity RecognitionText Classification FLAIR一、什么是FLAIR?二、FLAIR Library的优势是什么&#xff…

Linux flock和fcntl函数详解

文章目录 flock函数描述返回值和错误码笔记 fcntl函数描述复制文件描述符文件描述标志文件状态标志 咨询锁强制锁管理信号租赁文件和目录变更通知改变管道容量 返回值错误备注遗留问题 flock函数 主要功能是在已打开的文件应用或者删除共享锁或者独占锁。sys/file.h声明了这个…

时间序列聚类的直观方法

一、介绍 我们将使用轮廓分数和一些距离度量来执行时间序列聚类实验,同时利用直观的可视化,让我们看看下面的时间序列: 这些可以被视为具有正弦、余弦、方波和锯齿波的四种不同的周期性时间序列 如果我们添加随机噪声和距原点的距离来沿 y 轴…

苹果加大对印度的扶持,提高在其生产iphone的比重

KlipC报道:跟踪苹果产业链,有分析师预计2023年全球约12%-14%的iphone在印度生产,预计2024年,印度将生产20%-25%的iphone。 KlipC的合伙人Andi D表示:“近年来随着苹果对中国的以来,印度已经成为高科技制造和…

Netty实战专栏 | BIO详解

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Netty实战专栏 ✨特色专栏&#xff1a…

ESP32 for Arduino 分区信息

忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-11-04❤️❤️ 本篇更新记录 2023-11-04❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏…

“线性函数”和“非线性函数”是什么?

总是会把“线性函数”和“非线性函数”与“连续的数据类型”与“非连续的数据类型”混淆,特此记录 一、线性函数: 一个函数 f 是线性的,如果对于任何两个输入 x1​ 和 x2​ 和任何两个常数 a 和 b,下列等式成立: 例如…

BIOS开发笔记 - HDA Audio

在PC中,音频输出是一个重要的功能之一,目前大多数采用的是英特尔高清晰音效(英语:Intel High Definition Audio,简称为HD Audio或IHD)方案,它是由Intel于2004年所提出的音效技术,能够展现高清晰度的音质效果,且能进行多声道的播放,在音质(音效质量)上超越过去的其他…

Ubuntu18.04 下PCL的卸载与安装

目录 一、卸载有问题的PCL1.7 二、编译&&安装PCL1.8.1 2.1、安装PCL依赖 2.2、编译VTK 2.3、编译PCL源码 三、 总结 写这篇博客时,本文方法已经在笔记本Ubuntu和VM虚拟机成功安装PCL1.8.1,并且通过测试。 下文方法同样适用于ubuntu18.04。…

JsonPath 数据快速查找和提取工具

常用语法 表达式说明$表示根元素$.key选择根元素下的指定键名的值$.*选择根元素下的所有属性值$.array[*]选择根元素中的数组的所有元素$.key[subkey]选择根元素中的键名为key,子键名为subkey的值$.key[*].subkey选择根元素中的键名为key的所有元素的子键名为subke…

【PID专题】MATLAB如何实现PID?

MATLAB是一种非常强大的工具,用于实现和分析PID(比例-积分-微分)控制器。在MATLAB中,您可以使用控制系统工具箱来设计、模拟和调整PID控制系统。 以下是一般步骤,演示如何在MATLAB中实现PID控制: 1. 打开MA…

轻量封装WebGPU渲染系统示例<13>- 屏幕空间后处理效果(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/main/src/voxgpu/sample/ScreenPostEffect.ts 此示例渲染系统实现的特性: 1. 用户态与系统态隔离。 细节请见:引擎系统设计思路 - 用户态与系统态隔离-CSDN博客 2. 高频调用与低频调用隔离。…

算法随想录算法训练营第四十七天| 647. 回文子串 516.最长回文子序列

647. 回文子串 题目:给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。回文字符串 是正着读和倒过来读一样的字符串。子字符串 是字符串中的由连续字符组成的一个序列。具有不同开始位置或结束位置的子串,即使是由相同的字…

Mysql高级——Mysql8一主一从,多主多从搭建

修改 /etc/hosts文件 ip地址 master1 ip地址 master2 ip地址 slave1 ip地址 slave2一主一从 create database master1db;create table master1db.master1tab(name char(50));insert into master1db.master1tab VALUES(1111);insert into master1db.master1tab VALUES(2222);m…

Opencascad(C++)-创建自定义坐标系

文章目录 1、前言2、在Opencascad中显示小的坐标系3、在Opencascad中创建自定义的坐标系 1、前言 在Opencascad开发时,在view中可以显示小的坐标系,但是有时我们需要在建模时创建基准坐标系,当然可以作为工件坐标系也可以作为基准坐标系。本…

2023面试知识点三

1、强软弱虚引用 强引用 当内存不足的时候,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,打死也不回收~! 强引用是我们最常见的普通对象引用,只要还有一个强引用指向一个对象…

基于单片机的衣物消毒清洗机系统设计

收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、系统总体设计2.2 功能分析2.3 系统框架设计 二、硬件电路设计3.1 电源模块的设计 三、 软件设计4.1 系统整体流程4.4 软件整体流程实物图 四、 结论五、 文章目录 概要 基于单片机的衣物消毒清洗机可以应用在…

CSGO饰品价格暴跌的原因分析

CSGO饰品暴跌3个月,盘点6大原因 今天我们来聊一下CSGO饰品市场的情况。大部分装备从3月份开始就一直持续走低,到现在已经是7月份了,还有部分饰品呈阴跌趋势。整个市场沉寂一片,还有些悲观主义者天天在吆喝:市场崩盘了&…

Leetcode刷题详解——全排列

1. 题目链接:46. 全排列 2. 题目描述: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],…

PHP中文转拼音实现

pinyin.php 床前明月光&#xff0c;疑是地上霜。 举头望明月&#xff0c;低头思故乡 <?php /*** PHP 汉字转拼音 [包含20902个基本汉字5059生僻字]* author 楼教主(cik520qq.com)* version v1.2* note 请开启 mb_string 扩展*/var_dump(pinyin(床前明月光&#xff0c;疑是…