首页 > 编程语言 >Java-IO:浅谈对NIO的认识

Java-IO:浅谈对NIO的认识

时间:2024-09-06 09:54:55浏览次数:5  
标签:Java 浅谈 Buffer 线程 IO 缓冲区 Channel NIO

Java-IO:简述常见的IO模型
Java-IO:浅谈对IO的认识

NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO 主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。

一、NIO的核心概念

NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区),Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。NIO和传统IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。
在这里插入图片描述

1、Channel

首先说一下Channel,国内大多翻译成“通道”。Channel和IO中的Stream(流)是差不多一个等级的。只不过Stream是单向的,譬如:InputStream,OutputStream,而Channel是双向的,既可以用来进行读操作,又可以用来进行写操作。NIO中的Channel的主要实现有:FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel;分别对应文件IO、UDP和TCP(Server和Client)。

2、Buffer

Buffer,故名思意,缓冲区,实际上是一个容器,是一个连续数组。Channel提供从文件、网络读取数据的渠道,但是读取或写入的数据都必须经由Buffer。

上面的图描述了从一个客户端向服务端发送数据,然后服务端接收数据的过程。客户端发送数据时,必须先将数据存入Buffer中,然后将Buffer中的内容写入通道。服务端这边接收数据必须通过Channel将数据读入到Buffer中,然后再从Buffer中取出数据来处理。

在NIO中,Buffer是一个顶层父类,它是一个抽象类,常用的Buffer的子类有:ByteBuffer、IntBuffer、CharBuffer、LongBuffer、DoubleBuffer、FloatBuffer、ShortBuffer

3、Selector

Selector类是NIO的核心类,Selector能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间的上下文切换导致的开销。

二、NIO的缓冲区

JavaIO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。

NIO的缓冲导向方法不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

三、NIO的非阻塞

IO的各种流是阻塞的。这意味着,当一个线程调用read()或write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。

NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

标签:Java,浅谈,Buffer,线程,IO,缓冲区,Channel,NIO
From: https://blog.csdn.net/qq_29229567/article/details/141824212

相关文章

  • Java:集合的相关汇总介绍
    主要包含Set(集)、List(列表包含Queue)和Map(映射)。1、Collection:Collection是集合List、Set、Queue的最基本的接口。2、Iterator:迭代器,可以通过迭代器遍历集合中的数据。3、Map:是映射表的基础接口。一、List接口Java的List是非常常用的数据类型。List是有......
  • Java 虹软人脸识别SDK:基于虹软人脸识别SDK的Java项目集成指南
    基于虹软人脸识别SDK的Java项目集成指南虹软人脸识别SDK是一款功能全面且成熟的解决方案,广泛应用于智能设备、人脸识别门禁、身份验证等领域。集成虹软人脸识别SDK到Java项目中,可以实现高效的人脸检测、特征提取和比对功能,使得Java开发者能够在各类应用场景中快速部署人脸......
  • 2024不可不会的StableDiffusion
    这是我在学习StableDiffusion(稳定扩散模型简称SD)的第一篇入门文章,主要用于介绍稳定扩散模型和该领域的其他研究。在本文中,我想简要介绍一下如何使用Diffusers扩散库,来创建自己生成图像。闲话少说,我们直接开始吧!2.SD功能介绍简单来说,稳定扩散模型是一种可以在给定文......
  • 基于Java的信息发布与管理系统设计与开发-计算机毕业设计源码+LW文档
    摘要在互联网高度发展的今天,人们已经习惯利用网络来填充生活中的碎片时间,如听歌、看视频、浏览信息等。然而,遇到喜欢的内容时,由于时间限制,可能无法一次性看完。此外,各种信息内容分布在不同的平台,给用户查找带来了不便。针对这一问题,Java的信息发布与管理系统应运而生,它有效地解决......
  • 分布式IO在喷涂工艺环境中的应用
    导读喷涂是一种表面处理技术,它通过将液体或粉末状的涂料以雾化的形式均匀地施加到物体表面上,形成一层保护性或装饰性的涂层,喷涂的主要作用包括:保护作用:提供防腐蚀、耐磨损、抗紫外线等保护,延长产品的使用寿命;装饰作用:改善产品的外观,提供丰富的颜色和光泽,增加产品的美观度和市场竞......
  • Python异步编程:asyncio库详解
    \asyncio是Python的标准库,用于编写单线程的并发代码。它使用async和await语法来定义和调用异步函数,使得I/O密集型程序能够更有效地使用资源。asyncio的主要特点事件循环:asyncio程序由事件循环驱动,它负责调度协程的执行。协程:使用async定义的异步函数被称为协程。任务:asyn......
  • Java面试——基础篇
    基本数据类型与包装类基本数据类型与引用数据类型区别存储方式:基本数据类型直接存储值,而引用数据类型存储的是对象的引用(内存地址)内存分配:基本数据类型在栈上分配内存,引用数据类型在堆上分配内存(具体内容存放在堆中,栈中存放的是其具体内容所在内存的地址)。栈上的分配速度......
  • JavaWeb - Spring Boot - 请求参数
    @RequestMapping从注解名称上我们可以看到,@RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来,建立映射关系。SpringMVC接收到指定的请求,就会来找到在映射关系中对应的控制器方法来处理这个请求。@RequestMapping标识一个类:设置映射请求的请求路径的初始信......
  • Java工程师多年之后看指针
      指针是基本数据类型,占用4个字节。Int类型的数据计算机处理语言中是处中间层。使用图形化方式可以这样更形象直观。   计算机对二进制处理数据的方式比较敏感。现人们的大脑计数方式是通过十进制的方式计算日常和工作中需要的业务。操作符的限制,才增加了十六进制......
  • 记录 VMware Workstation 官方下载方式
    VMwareWorkstation对个人使用已免费,但想找到官方下载地址很困难,在此记录一下下载地址:https://support.broadcom.com/group/ecx/productdownloads?subfamily=VMware+Workstation+Pro有账号的话直接登录,没有的话右上角注册即可(注册后需要主动登录)经过不太友好的登录后,再次访问......