Netty实战专栏 | JavaIO演进之路

Netty实战专栏 | JavaIO演进之路

学习参考 :

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 调用后,会一直阻塞,直到内核把数据拷贝到用户空间。

7.2Java NIO

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

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

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,后面文章会首先同步至公众号。

相关推荐
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
码农小旋风4 小时前
详解K8S--声明式API
后端
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
睡觉谁叫~~~5 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
2401_865854888 小时前
iOS应用想要下载到手机上只能苹果签名吗?
后端·ios·iphone
AskHarries8 小时前
Spring Boot集成Access DB实现数据导入和解析
java·spring boot·后端
2401_857622668 小时前
SpringBoot健身房管理:敏捷与自动化
spring boot·后端·自动化