前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Netty实战专栏 | JavaIO演进之路

Netty实战专栏 | JavaIO演进之路

作者头像
程序员Leo
发布2023-11-16 21:58:52
1470
发布2023-11-16 21:58:52
举报
文章被收录于专栏:Java知识点Java知识点

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
image

7.2Java NIO

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

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

image
image

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

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-11-08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 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.总结
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com