资讯专栏INFORMATION COLUMN

NIO基础知识

scq000 / 3172人阅读

摘要:独立与内存之外的,存在于物理内存中的一块内存区域不收的管理。由于直接缓冲区在内存之外,如果无法进行有效管理容易造成物理内存溢出,因此最好仅在直接缓冲区能在性能方面带来明显好处时使用。

Java NIO是java用来提高java IO操作性能。基于网上的教程和一些资料对NIO的知识进行整理和总结

缓冲区Buffer

底层是由数组实现并构成的,负责数据的存储,不同的数据类型有对应类型的缓冲区,但容量是在Buffer对象声明时指定的,Buffer对象一旦创建后,容量不能改变。常用的Buffer类型及对应的基本数据类型:

   ByteBuffer     (byte)
   CharBuffer     (char)
   ShortBuffer    (short)
   IntBuffer      (int)
   LongBuffer     (long)
   FloatBuffer    (float)
   DoubleBuffer   (double)

不同类型的Buffer管理缓冲区的方式都一致,通过allocate()方法获取Buffer对象,且都是间接缓存区

Buffer的相关属性

position:当前正在进行处理的数据在缓冲区的位置
limit:缓冲区中有效数据的范围
capacity:缓冲区的最大容量
mark:用来记录position所在的位置,与mark()、reset()方法联合使用
例:以ByteBuffer为例

   ByteBuffer ByteBuffer = ByteBuffer.allocate(10);

Buffer的相关常用方法

put():向缓冲区存放数据
例:

byteBuffer.put("hello".getBytes());




flip():切换缓冲区的读写状态,
例:

byteBuffer.flip();




get():从缓存区获取数据
例:

byteBuffer.get();




rewind():使用get()方法从缓冲区获取一部分或全部数据后,需要在重新从缓冲区中获取数据,需要先调用rewind()方法,然后再使用get()方法
例:

byteBuffer.rewind();




mark():将缓冲区属性position的当前取值赋给属性mark,例:

byteBuffer.get();
byteBuffer.mark();
byteBuffer.get();




reset():将缓冲区属性position的值重置为之前调用mark()方法时的position的值
例:

byteBuffer.reset();




clear():重置缓冲区属性position=0,属性limit=capacity,这样就无法获取到缓冲区中正确的数据了,但是clear()方法不会清空缓冲区中已存在的数据
例:

byteBuffer.clear();

Buffer相关属性的取值范围

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

直接缓冲区

根据缓冲区在屋里内存中的位置分为:直接缓冲区、间接缓冲区
间接缓冲区:是在JVM的堆内存中进行创建的,JVM的GC能够管理缓冲区占用的内存。使用间接缓冲区进行IO操作数据时,需要从用户地址空间copy到内核地址空间,或是从内核地址空间copy到用户地址空间,所以IO性能没有直接缓冲区的好。


直接缓冲区:使用ByteBuffer.allocateDirect(1024)来创建直接缓冲区,直接缓冲区只有ByteBuffer类型。独立与JVM内存之外的,存在于物理内存中的一块内存区域;不收JVM的GC管理。JVM会尽最大努力在此缓冲区上执行本机IO操作以提高IO性能。由于直接缓冲区在JVM内存之外,如果无法进行有效管理容易造成物理内存溢出,因此最好仅在直接缓冲区能在性能方面带来明显好处时使用。

NIO分散读取和聚集写入

Scattering reads:分散读取按照缓冲区的顺序依次将数据读取到应用程序中;

   read(byte[])

Gathering writes:聚集写入按照缓冲区的顺序依次将应用程序中的数据写入到缓冲区中:

   write(byte[])

NIO字符集

编码:字符串转换成字节数组的过程
解码:字节数组转换成字符串的过程
解码和编码过程中,字符串与字节数组相互转换使用到的字符集;通过Chartset.forName(charsetName)方法进行声明

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68636.html

相关文章

  • 关于Java IO与NIO知识都在这里

    摘要:从通道进行数据写入创建一个缓冲区,填充数据,并要求通道写入数据。三之通道主要内容通道介绍通常来说中的所有都是从通道开始的。从中选择选择器维护注册过的通道的集合,并且这种注册关系都被封装在当中停止选择的方法方法和方法。 由于内容比较多,我下面放的一部分是我更新在我的微信公众号上的链接,微信排版比较好看,更加利于阅读。每一篇文章下面我都把文章的主要内容给列出来了,便于大家学习与回顾。 Ja...

    Riddler 评论0 收藏0
  • JDK10都发布了,nio你了解多少?

    摘要:而我们现在都已经发布了,的都不知道,这有点说不过去了。而对一个的读写也会有响应的描述符,称为文件描述符,描述符就是一个数字,指向内核中的一个结构体文件路径,数据区等一些属性。 前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 本来我预想是先来回顾一下传统的IO模式的,将传统的IO模式的相关类理清楚(因为IO的类很多)。 但是,发现在整理的过程已...

    YFan 评论0 收藏0
  • NIO网络相关基础知识

    摘要:操作系统是能够获取到事件操作完成的事件,基于回调函数机制和操作系统的操作控制实现事件检测机制。 前面的文章NIO基础知识介绍了Java NIO的一些基本的类及功能说明,Java NIO是用来替换java 传统IO的,NIO的一些新的特性在网络交互方面会更加的明显。 Java 传统IO的弊端     基于JVM来实现每个通道的轮询检查通道状态的方法是可行的,但仍然是有问题的,检查每个通道...

    1fe1se 评论0 收藏0
  • 动力节点JavaNIO教程,轻松攻破Java NIO技术壁垒

    摘要:学习和掌握技术已经不是一个攻城狮的加分技能,而是一个必备技能。是双向的,不仅可以读取数据还能保存数据,程序不能直接读写通道,只与缓冲区交互为了让大家不被高并发与大量连接处理问题所困扰,动力节点推出了高效处理模型应用教程。 大家肯定了解Java IO, 但是对于NIO一般是陌生的,而现在使用到NIO的场景越来越多,很多技术框...

    ralap 评论0 收藏0
  • Java NIO 基础(一)

    摘要:通过协议向网络读写数据通过协议向网络读写数据以一个服务器的形式,监听到来的连接,对每个连接建立一个。 Java NIO 教程 NIO是什么? 它是Java1.4之后出现的IO API,与传统IO和网络API不同,具有非阻塞的特点。 在BIO中我们使用字节流和字符流。NIO中我们使用channel和buffer。数据总是从一个channel中读取到buffer中,或者从buffer中写入...

    hizengzeng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<