NIO 学习笔记

 


 

0. 介绍

  参考   关于Java IO与NIO知识都在这里   ,在其基础上进行修改与补充。

 


 

1. NIO介绍

  1.1 NIO 是什么

  Java NIO 是 java 1.4, 之后新出的一套IO接口.

  NIO中的N可以理解为Non-blocking,不单纯是New。

 

  1.2 NIO的特性/NIOIO区别

  1. IO是面向流的,NIO是面向缓冲区的。
  2. IO流是阻塞的,NIO流是不阻塞的。
  3. NIO有选择器,而IO没有。

 

  阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

  阻塞调用:是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
  非阻塞调用:指在不能立刻得到结果之前,该调用不会阻塞当前线程。

  1.3 读数据和写数据方式

  1. 从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。
  2. 从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

  1.4 NIO核心组件简单介绍

  1. Channels
  2. Buffers
  3. Selectors

 


 

2. Buffer

  2.1 Buffer(缓冲区)介绍

  1. Java NIO Buffer用于和NIO Channel交互。我们从Channel中读取数据到Buffer里,从Buffer把数据写入到Channel;
  2. Buffer本质上就是一块内存区;

  2.2 Buffer 的属性

  capacity(容量):

  缓冲区的 capacity 表明可以储存在缓冲区中的最大数据容量。实际上,它指定了底层数组的大小 ,或者至少是指定了准许我们使用的底层数组的容量。一旦Buffer写满了就需要清空已读数据以便下次继续写入新的数据。

 

  position(位置):

  当写入数据到Buffer的时候需要选中一个确定的位置开始,默认初始化时这个位置position为0,一旦写入了数据比如一个字节,整型数据,那么position的值就会指向数据之后的一个单元,position最大可以到capacity-1。

  当从Buffer读取数据时,也需要从一个确定的位置开始。Buffer从写入模式变为读取模式时,position会归零,每次读取后,position向后移动。

 

  limit(限制):

  在写模式,limit的含义是我们所能写入的最大数据量。它等同于Buffer的容量。

  一旦切换到读模式,limit则代表我们所能读取的最大数据量,他的值等同于写模式下position的位置。

  数据读取的上限是Buffer中已有的数据,也就是limit的位置(原position所指的位置)。

   2.3 Buffer的常见方法

  mark() :

  记录当前标记,以便后来可以定位到此处

  0 <= mark <= position <= limit <= capacity

 

   reset():

  将position定位到mark处

 

  rewind()

  取消mark标记

 

  flip()

  flip()方法可以吧Buffer从写模式切换到读模式。调用flip()方法会把position归零,并设置limit为之前的position的值。 也就是说,现在position代表的是读取位置,limit标示的是已写入的数据位置。

 

  clear() :

  为写数据做好准备,相当于缓冲区刚分配时的状态
  将limit设置为capacity的值
  将position归零

 

  2.4 Buffer的使用方式/方法介绍

  分配缓冲区(Allocating a Buffer):

ByteBuffer buf = ByteBuffer.allocate(10);

  

  写入数据到缓冲区(Writing Data to a Buffer):

  方法一:从Channel中写数据到Buffer

int bytesRead = inChannel.read(buf); 

 

  方法二:通过put写数据

buf.put(10);

 


 

3. Channel

  3.1 介绍

  通常来说NIO中的所有IO都是从 Channel(通道) 开始的。

  从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。

  从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

  数据读取和写入操作图示:

  3.2 channel与流的区别

  1. 通道可以读也可以写,流一般来说是单向的(只能读或者写,所以之前我们用流进行IO操作的时候需要分别创建一个输入流和一个输出流)。
  2. 通道可以异步读写。
  3. 通道总是基于缓冲区Buffer来读写。

 

  3.3 Java NIO中最重要的几个Channel的实现

  1. FileChannel: 用于文件的数据读写
  2. DatagramChannel: 用于UDP的数据读写
  3. SocketChannel: 用于TCP的数据读写,一般是客户端实现
  4. ServerSocketChannel: 允许我们监听TCP链接请求,每个请求会创建会一个SocketChannel,一般是服务器实现

  待补充。。。

 


 

4. Selector

  4.1 介绍

  Selector 一般称 为选择器 ,它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个channels,也就是可以管理多个网络链接。

  使用Selector的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个线程,避免了线程上下文切换带来的开销。

待补充。。。

 

 


 

转载于:https://www.cnblogs.com/share23/p/9635001.html

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

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

相关文章

[原创]java获取word里面的文本

需求场景 开发的web办公系统如果需要处理大量的Word文档&#xff08;比如有成千上万个文档&#xff09;&#xff0c;用户一定提出查找包含某些关键字的文档的需求&#xff0c;这就要求能够读取 word 中的文字内容&#xff0c;而忽略其中的文字样式、表格、图片等信息。 方案分析…

ab 模拟_Ab测试第二部分的直观模拟

ab 模拟In this post, I would like to invite you to continue our intuitive exploration of A/B testing, as seen in the previous post:在本文中&#xff0c;我想邀请您继续我们对A / B测试的直观探索&#xff0c;如前一篇文章所示&#xff1a; Resuming what we saw, we…

1886. 判断矩阵经轮转后是否一致

1886. 判断矩阵经轮转后是否一致 给你两个大小为 n x n 的二进制矩阵 mat 和 target 。现 以 90 度顺时针轮转 矩阵 mat 中的元素 若干次 &#xff0c;如果能够使 mat 与 target 一致&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输…

samba登陆密码不正确

win7访问Linux Samba的共享目录提示“登录失败&#xff1a;用户名或密码错误”解决方法 解决办法&#xff1a;修改本地安全策略 通过Samba服务可以实现UNIX/Linux主机与Windows主机之间的资源互访&#xff0c;由于实验需要&#xff0c;轻车熟路的在linux下配置了samba服务&…

各类软件马斯洛需求层次分析_需求的分析层次

各类软件马斯洛需求层次分析When I joined Square, I was embedded on a product that had been in-market for a year but didn’t have dedicated analytics support.当我加入Square时&#xff0c;我被嵌入了已经上市一年但没有专门的分析支持的产品。 As you might expect,…

MySQL的变量分类总结

在MySQL中&#xff0c;my.cnf是参数文件&#xff08;Option Files&#xff09;&#xff0c;类似于ORACLE数据库中的spfile、pfile参数文件&#xff0c;照理说&#xff0c;参数文件my.cnf中的都是系统参数&#xff08;这种称呼比较符合思维习惯&#xff09;&#xff0c;但是官方…

亚洲国家互联网渗透率_发展中亚洲国家如何回应covid 19

亚洲国家互联网渗透率The COVID-19 pandemic has severely hit various economies across the world, with global impact estimated between USD 6.1 trillion and USD 9.1 trillion, equivalent to a loss of 7.1% to 10.5% of global gross domestic product (GDP).[1] More…

snake4444勒索病毒成功处理教程方法工具达康解密金蝶/用友数据库sql后缀snake4444...

*snake4444勒索病毒成功处理教程方法 案例&#xff1a;笔者负责一个政务系统的第三方公司的运维&#xff0c;上班后发现服务器的所有文件都打不开了&#xff0c;而且每个文件后面都有一个snake4444的后缀&#xff0c;通过网络我了解到这是一种勒索病毒。因为各个文件不能正常打…

有史以来最漂亮的游戏机

The recent reveal of the PlayStation 5’s design has divided the gaming world. There are those who appreciate its bold, daring industrial design and those who would have preferred something a little less outlandish; perhaps a little more traditional.吨 他最…

墨刀原型制作 位置选择_原型制作不再是可选的

墨刀原型制作 位置选择The ‘role’ of a designer has been a topic of discussion several many years now. In the past decade, the role of a Designer got split into several different roles like — Graphic Designer, User Experience Designer, Interaction Designe…

eclipse maven 构建简单springmvc项目

环境&#xff1a;eclipse Version: Oxygen.3a Release (4.7.3a) 创建maven Project项目&#xff0c;目录结构 修改工程的相关编译属性 修改pop.xml&#xff0c;引入springmvc相关包 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.…

使用协同过滤推荐电影

ALSO, ARE RECOMMENDER SYSTEMS INFLUENCING OUR TASTE??此外&#xff0c;推荐系统是否影响我们的口味&#xff1f; An excerpt on creating a movie recommender system similar to the OTT platforms.有关创建类似于OTT平台的电影推荐系统的摘录。 INTRODUCTION介绍 For…

数据暑假实习面试_面试数据科学实习如何准备

数据暑假实习面试Unfortunately, on this occasion, your application was not successful, and we have appointed an applicant who…不幸的是&#xff0c;这一次&#xff0c;您的申请没有成功&#xff0c;我们已经任命了一位符合以下条件的申请人&#xff1a; Sounds famili…

谷歌 colab_如何在Google Colab上使用熊猫分析

谷歌 colabRecently, pandas have come up with an amazing open-source library called pandas-profiling. Generally, EDA starts by df.describe(), df.info() and etc which to be done separately. Pandas_profiling extends the general data frame report using a singl…

Java之生成Pdf并对Pdf内容操作

虽说网上有很多可以在线导出Pdf或者word或者转成png等格式的工具&#xff0c;但是我觉得还是得了解知道是怎么实现的。一来&#xff0c;在线免费转换工具&#xff0c;是有容量限制的&#xff0c;达到一定的容量时&#xff0c;是不能成功导出的;二来&#xff0c;业务需求&#x…

边际概率条件概率_数据科学家解释的边际联合和条件概率

边际概率条件概率Probability plays a very important role in Data Science, as Data Scientist regularly attempt to draw statistical inferences that could be used to predict data or analyse data better.P robability起着数据科学非常重要的作用&#xff0c;为数据科…

袋装决策树_袋装树是每个数据科学家需要的机器学习算法

袋装决策树袋装树木介绍 (Introduction to Bagged Trees) Without diving into the specifics just yet, it’s important that you have some foundation understanding of decision trees.尚未深入研究细节&#xff0c;对决策树有一定基础了解就很重要。 From the evaluatio…

[JS 分析] 天_眼_查 字体文件

0. 参考 js分析 猫_眼_电_影 字体文件 font-face 1. 分析 1.1 定位目标元素 1.2 查看网页源代码 1.3 requests 请求提取得到大量错误信息 对比猫_眼_电_影抓取到unicode编码&#xff0c;天_眼_查混合使用正常字体和自定义字体&#xff0c;难点在于如何从 红 转化为 美。 一开始…

经天测绘测量工具包_公共土地测量系统

经天测绘测量工具包部分-乡镇第一师 (Sections — First Divisions of Townships) The PLSS Townships are typically divided into 36 Sections (nominally one mile on a side), but in the national standard this feature is called the first division because Townships …

洛谷 P4012 深海机器人问题【费用流】

题目链接&#xff1a;https://www.luogu.org/problemnew/show/P4012 洛谷 P4012 深海机器人问题 输入输出样例 输入样例#1&#xff1a; 1 1 2 2 1 2 3 4 5 6 7 2 8 10 9 3 2 0 0 2 2 2 输出样例#1&#xff1a; 42 说明 题解&#xff1a;建图方法如下&#xff1a; 对于矩阵中的每…