IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java NIO简介 -> 正文阅读

[Java知识库]Java NIO简介

Java NIO简介

JDK1.4版本之前,Java IO类库是阻塞IO;从1.4版本开始,引进了新的异步IO库,被称为Java New IO类库,简称 Java NIO,之前阻塞的称为Old IO,简称OIO。新的异步IO库的目标是让Java支持非阻塞IO,弥补OIO同步阻塞的不足,为标准的Java代码提供了高速的,面向缓冲区的IO。

Java NIO 三个核心组件

  • Channel (通道)
  • Buffer(缓冲区)
  • Selector(选择器)

Java NIO是属于IO多路复用模型,NIO组件提供了统一的API,为开发人员屏蔽了底层不同操作系统的差异。

NIO和OIO对比

  • OIO是面向流(Stream Oriented)的,NIO是面向缓冲区(Buffer Oriented)的。

    • 面向流

      指面向字节流或字符流,一般OIO操作中。以流式的方式顺序地从一个流(Stream)中读取一个或多个字节。因为顺序读取,所以不能随意改变读取指针的位置。

    • 面向缓冲区

      NIO中引入了Channel(通道)和Buffer(缓冲区)的概念。读取和写入只需要从通道中读取数据到缓冲区,或将数据从缓冲区中写入到通道中。并不是顺序操作,所以可以随意读取Buffer中任意位置的数据。

  • OIO操作是阻塞的,NIO操作是非阻塞的。

    • OIO 阻塞

      调用一个read方法读取一个文件的内容时候,调用read的线程会被阻塞住,直到read操作完成。

    • NIO 非阻塞

      调用read方法时,如果此时有数据,则read读取数据并返回。如果此时没有数据,则read直接返回,而不会阻塞当前线程。依靠的就是使用了通道和通道的多路复用技术。

  • OIO没有选择器(Selector)的概念,而NIO有选择器的概念。

    NIO实现是基于底层的选择器的系统调用。

    NIO的选择器是需要底层操作系统提供支持,而OIO不需要用到选择器。

通道(Channel)

在OIO中,同一个网络连接会关联到两个流:一个输入流(Input Stream),另外一个输出流(Ouput Stream)。通过这两个流,不断地进行输入和输出的操作。

在NIO中,同一个网络连接使用一个通道表示。所以NIO的IO操作都是从通道开始。

一个通道类似于OIO中两个流的结合体,既可以从通道读取,也可以向通道写入。

Selector选择器

是一个IO事件的查询器,通过选择器,一个线程可以查询多个通道的IO事件的就绪状态。

从开发层面即,首页把通道注册到选择器中,然后通过选择器的内部的机制。查询(select)这些注册的通道是否有已经就绪的IO事件(例如可读,可写,网络连接完成等)

一个选择器只需一个线程监控,即使用一个线程就可以通过选择器去管理多个通道,

与OIO相比,使用Selector选择器的最大优势:系统开销小,系统不必为每一个网络连接(文件描述符)创建进程/线程,从而减少系统开销。

缓冲区(Buffer)

缓冲区是面向流的OIO没有的,是NIO非阻塞的前提和基础。
通道的读取就是将数据从通道读取到缓冲区;通道的写入就是将数据从缓冲区写入到通道中。

NIO的Buffer(缓冲区)本质上是一个内存块,既可以写入数据,也可以从中读取数据。
NIO的Buffer类位于java.nio.Buffer是一个抽象类。
注意:是一个非线程安全的类

Buffers are not safe for use by multiple concurrent threads. If a buffer is to be used by more than one thread then access to the buffer should be controlled by appropriate synchronization.

Buffer类的主要子类

image-20220429094622353

除了MappedByteBuffer的其他7种覆盖了能在IO种传输的所有Java的基本数据类型,MappedByteBuffer是专门用于内存映射的ByteBuffer类型。

Buffer类的主要属性

  • mark: 备忘位置,mark在被标记前是未定义的

    可以将当前的positon读取位置临时存入mark中,需要时候再从mark标记恢复到position位置

    调用mark()方法来设置mark=position,再调用reset()可以让position恢复到mark标记的位置

    即position=mark

  • positon: 当前位置,缓冲区中下一个要被读或写的元素索引

    positon属性与缓冲区的读写模式有关。

    • 写入模式
      1. 刚进入写模式,position值为0,代表写入位置从头开始
      2. 每当一个数据写入缓冲区之后,position会向后移动到下一个可写位置
      3. 初始的position值为0,最大值为limit-1。
    • 读取模式 (模式切换需要使用flip翻转方法)
      1. 缓冲区刚开始进入到读模式,position值会被重置为0
      2. 从缓存区读取时,也是从position位置开始读,读取后向后移动到下一个可读位置
      3. position最大的值为最大可读上限limit
  • limit: 读写限制, 缓冲区中第一个不能被读或写的元素索引

    limit属性在读写模式下也有不同的含义

    • 写入模式

      limit属性值代表可以写入的数据最大上限

      在刚进入写模式时,limit的值会被设置为capacity最大容量值。

    • 读取模式

      切换成读模式时候,会将之前写入当前位置positon设置为读模式下limit值。

      意思就切换时候把limit值设置为刚刚写到哪儿了。

  • capacity: 缓冲区的最大容量。在缓冲区创建时设定,一经设定永远不能改变

Buffer类的重要方法
  • allocate() 创建缓冲区

    在使用Buffer(缓冲区)之前,首先需要获取Buffer子类的实例对象,并分配内存空间。

    通过调用子类的allocate()方法。

  • put() 写入到缓冲区

? put了一个值进去,position元素位置从0变成1,limit以及capacity没变

  • flip() 翻转

    向缓存区写入数据后,并不能直接从里面读取数据。此时缓冲区还处于写模式,想要读取数据需要将缓冲区转换成读模式。flip()的作用就是将写入模式翻转成读取模式。

    沿着刚刚的put操作后,flip()翻转后对比上图可以发现

    • 首先设置limit的值为刚刚position最后写入的值
    • 然后把position值设为0,表示从头开始
    • 最后清除之前就的mark标记,mark标记之前是写模式下的临时绘制。
  • clear()清空缓冲区,变成写入模式

  • compact()压缩缓冲区,变成写入模式

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:33:07  更:2022-04-30 08:35:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:33:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码