Nio 是一种非阻塞io模型,在java1.4引入

  • Buffer 缓存区

  • 在nio中,所有数组都是通过缓冲区进行处理的
  • bytebuffer 除了直接内存开辟,底层都是使用了byte[] 作为媒介
  • 几个重要的概念
  • 容量 (capacity) :表示 Buffer 最大数据容量,缓冲区容量不能为负,并且创建后不能更改。
  • 限制 (limit) :第一个不应该读取的数据的索引,即位于 limit 后的数据不可读。缓冲区的限制不能为负,并且不能大于其容量。
  • 位置 (position):下一个要读取或写入的数据的索引。缓冲区的位置不能为负,并且不能大于其限制
  • 标记 (mark) 与重置 (reset) :标记是一个索引,通过 Buffer 中的 mark() 方法指定 Buffer 中一个特定的 position,之后可以通过调用 reset() 方法恢复到这个 position.
  • 代码

  • 创建一个1024大小的缓冲区
//这里的1024 表示缓冲区的容量
ByteBuffer allocate = ByteBuffer.allocate(1024);
allocate.putLong(1);allocate.putInt(2);allocate.putDouble(1.2);
     allocate.flip(); //将缓存区界限设置为当前位置,并将当前位置重置为0,相当于切换成了读模式//这里可以想象成了一个解包的过程,我们必须按照加入的顺序读取类型,否则会导致数据不一致long aLong = allocate.getLong();System.out.println(aLong);
     allocate.mark();//创建一个position标记long aLong = allocate.getLong();int anInt = allocate.getInt();System.out.println(aLong);System.out.println(anInt);allocate.reset(); //恢复到标记处的positionlong aLong1 = allocate.getLong();System.out.println(aLong1);

堆外内存

  • buffer 中提供了一个很重要的功能,可以让我们直接开辟物理内存,相当于c 语言的 malloc
       ByteBuffer bytebuffer = ByteBuffer.allocateDirect(1024);
  • 优点 可以减少一次拷贝,提供访问速度

  • 缺点 不好把握,容易内存泄露

  • 直接内存什么时候释放

  • 该块内存不受jvm管理,内部使用了unsafe开辟与回收,当bytebuffer 实例需要被gc回收,会调用unsafe.freeMemory() 释放内存,所以不使用了我们直接bytebuffer=null; 就可以回收掉

  • buffer 中还有一些其它的实现类

  • LongBuffer

  • IntBuffer

  • 除可boolean 没有基本类型都有对应的方法

nio-buffer相关推荐

  1. java.nio.Buffer flip()方法

    碰到java.nio.Buffer flip()方法,不明白是干什么用的,于是就赶快查看中文API,API上面翻译的是:"反转此缓冲区.首先对当前位置设置限制,然后将该位置设置为零.如果已定 ...

  2. java nio.Buffer的属性变化

    java nio.Buffer的属性变化 认识Buffer Channel 提供从文件.网络读取数据的渠道,但是读取或写入的数据都必须经由 Buffer.Buffer,实际上是一个连续数组. 常用的 ...

  3. mappedbytebuffer_Java NIO Buffer【MappedByteBuffer】概述与FileChannel的联系

    " NIO[Non-blocking IO非阻塞式IO],可以让你非阻塞的使用IO,例如:当线程从通道读取数据到缓冲区时,线程还是可以进行其他事情.当数据被写入到缓冲区时,线程可以继续处理它 ...

  4. java.nio.Buffer 中的 flip()方法

    在Java NIO编程中,对缓冲区操作常常需要使用  java.nio.Buffer中的 flip()方法. Buffer 中的 flip() 方法涉及到 Buffer 中的capacity.posi ...

  5. JAVA NIO - Buffer Channel

    2019独角兽企业重金招聘Python工程师标准>>> Buffer和Channel是NIO中的基本对象,凡是涉及到I/O的操作都都会用到Buffer和Channel. Channe ...

  6. 【Java 网络编程】NIO Buffer 简介 ( 概念 | 数据传输 | 标记 | 位置 | 限制 | 容量 | 标记 | 重置 | 清除 | 翻转 | 重绕 | 链式操作 )

    文章目录 I. Buffer 简介 II. Buffer 属性 III. Buffer 数据读写 IV. Buffer 标记 mark() 和重置 reset() V. Buffer 清除 翻转 重绕 ...

  7. 关于java.nio.Buffer的API

    Buffer操作是Java NIO应用开发的基础,以下介绍Buffer操作的相关参数以及操作说明. 浏览全文 转载于:https://www.cnblogs.com/ungshow/archive/2 ...

  8. Java NIO ———— Buffer 缓冲区详解

    引言 缓冲区是一个用于特定基本类型的容器.由java.nio 包定义,所有缓冲区都是 Buffer 抽象类的子类. Java NIO 中的 Buffer ,主要用于与NIO 通道进行交互.数据从通道存 ...

  9. java rewind()_Java NIO Buffer的clear()、reset()、rewind()、flip()方法的区别

    Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.注意:Buffer是非线程安全类.capacity一旦初始化后就不会改变,其值一直为常量.在使用中我们一般使用Buffer的抽象子类 ...

  10. NIO Buffer

    使用Buffer读写数据一般遵循以下四个步骤: 写入数据到Buffer 调用flip()方法 从Buffer中读取数据 调用clear()方法或者compact()方法 RandomAccessFil ...

最新文章

  1. android textview 常用属性id,Android TextView常用属性
  2. 新手vue构建单页面应用实例
  3. 利用git 进行多人协作开发
  4. MySql—索引原理
  5. java mvc mvp mvvm_一篇文章了解架构模式:MVC/MVP/MVVM
  6. java random array_java復習之Math、Random、Arrays工具類
  7. 卸载python27_27. 移除元素(Python)
  8. C#高级编程----反射的小结
  9. frok的一个Demo测试素数
  10. 项目管理 : 智能家居项目实施计划
  11. android 判断 飞行模式,Android 设置飞行模式,判断是否是飞行模式
  12. leetcode LCP 03. 机器人大冒险 -java
  13. 【车间调度】基于matlab帝国企鹅算法求解柔性车间调度问题【含Matlab源码 1991期】
  14. backurl使用,登录后跳转回当前页
  15. Cannot resolve method ‘subscribe(anonymous io.reactivex.Observer<xxx>)‘的解决方案
  16. 服务器修改万兆网卡为千兆,从千兆到万兆 惠普服务器网卡横向导购 上
  17. r语言8c多字节字符串有错,R语言答疑:txt文件无法被R正确读入
  18. 【二叉树】完美二叉树
  19. Python绘图实例36:分叉树绘制
  20. 基于Matlab使用线性FM波形对带状合成孔径雷达系统建模(附源码)

热门文章

  1. python编写音乐-python写的定时播放音乐
  2. 大学计算机专业:计算机科学与技术和软件工程有什么区别?
  3. 微软小冰 3.0:有视力,有声音,人工智能已离你越来越近
  4. spring批量写入mysql数据库_快速使用组件-spring batch(3)读文件数据到数据库
  5. python常用模块资料
  6. R语言 class() mode() typeof() 查看函数的区别
  7. Android设置EditText弹出软键盘
  8. Oracle学习笔记(最重要的是PL/SQL编程)
  9. 系统分析师考试真题答案概念一
  10. 功夫不负有心人,机械师T58完美吃上黑贫果