所谓的输入,输出,就是把数据移除或移入缓冲区。
 

硬件不能直接访问用户控件(JVM)。
基于存储的硬件设备操控的是固定大小的数据块儿,用户请求的是任意大小的或非对齐的数据块儿。
 
虚拟内存:使用虚拟地址取代取代物理地址。
  1. 可以有多个虚拟地址指向同一个物理地址。
  2. 虚拟内存空间可以大于实际的硬件内存。
应用:直接内存使用--使用户空间虚拟地址和内核虚拟地址同时指向同一个物理地址,可以使硬件直接访问用户空间内存。
 

数据库等应用严重依赖文件锁定。

缓冲区:

缓冲区是包在一个对象内的基本数据类型数组。Buffer把关于数据内容和信息包含在一个对象中,并定义了一系列API。
 
信息提供操作属性:0<=mark<=position<=limit<=capicity
  1. 容量(Capicity):创建时设定,无法动态更改。
  2. 上界(Limit):现存元素计数。
  3. 位置(Position):下一个要被读取的元素位置。动态更新。
  4. 标记(Mark):备忘位置,mark()设定mark=position,reset()设定postion=mark。
 
插入“hello”之后:
 

Buffer类方法签名:
返回Buffer自身的一些方法可以直接级联调用。
 
创建只读缓存。例如ByteBuffer:
ByteBuffer bf = ByteBuffer.allocate(1024).asReadOnlyBuffer()
 
Flip():讲一个能够继续添加数据元素的填充状态的缓冲区翻转为一个准备读出元素的释放状态。
bf.flip() = bf.limit(bf.position()).position(0)
 

rewind():
bf.rewind() = bf.position(0)
 
缓冲区不是线程安全。
 
mark():Buffer是从当前位置开始向通道内输出内容的,如下,怎会输出‘ow’,position到6

reset()后,positon至mark位置。
 
两个具有相同元素的Buffer,只要剩余元素数量(从位置到上界)相同,就equals=true。
 
Buffer.get(byte[]):BufferUnderflowException;
当将一个buffer内容读入数组,buffer内容不足以填充数组时,会抛出此异常。因为需要指明可以读入的buffer内容长度。如下:
Buffer.get(byte[], 0, Buffer.remaining());
 
Buffer.put(byte[]):BufferUnderflowException;
当将数组元素写入buffer,buffer没有足够的空间时,会抛出此异常。
 
Buffer.wrap(byte[], int offset, int length):offset,length只是设置了初始化状态,并不是创建只占数组子集的缓冲区,缓冲区可以可以存取数组的全部范围。区别slice函数。
 
allocate(), wrap() 创建的缓冲区都是间接的,使用备份数组,可以获得数组的操作权。
 
Duplicate()复制缓冲区会创建一个新的Buffer对象,但是并不复制数据,原始缓冲区和副本会操作同样的数据元素。
 
Slice() 创建从原始缓冲区当前位置开始的新的缓冲区,容量是原始缓冲区的剩余容量,(limit-position),与原始缓冲区共享一段数据元素子序列。分割出来的子序列继承只读和直接属性。
 

每个基本的数据类型都是以连续的字节序列存储在内存中,多字节被存储在内存中的方式称为字节顺序(endian-ness)。如果数字数值的最高字节--big-end(大端)位于低位地址,那么系统就是大端字节顺序,反之小端字节顺序。
 
IP协议规定了使用大端的网络字节顺序概念。
 
通过ByteOrder.nativeOrder() 输出LITTLE_ENDIAN或者BIG_ENDIAN判断。
 
Java默认的字节序是大端序,系统无关性,ByteBuffer.order() 总是范围ByteOrder.BIG_ENDIAN。
 
只有字节缓冲区有资格参与IO操作,IO操作的目标区域必须是连续的字节序列。JVM中的数据字节数组可能存储不连续,切GC可能会对其进行移动。所以IO不能直接操作。
 
直接缓冲区用于与通道或固有IO例程交互,通过固有代码告知系统直接操作内存区域。
直接缓冲区=》通道
非直接缓冲区=》临时直接缓冲区=》IO=》临时直接缓冲区回收。
 
选择依据执行频率,高频脚本使用直接缓存区。
 
创建直接缓冲区是调用本地操作系统分配的内存,比基于JVM创建的基于堆栈的缓冲区更加耗费,所以也不会被回收管理。
 
先使其工作,再加快其运行。首先注重正确性。过早的优化是所有祸害的根源。
 
ByteBuffer.allocateDirect(),开辟直接内存。
 
视图缓冲区:
 
通过已有的缓冲区对象示例的工厂方法来创建。视图缓冲维护自己的属性、容量、位置、上界和标记,但是和原来的缓冲区共享数据元素。如,ByteBuffer类允许创建视图来将byte型缓冲数组转化为其它的原始类型,ByteBuffer.asLongBuffer()。为基础缓冲区的切分,基于基础缓冲区的位置和上界(position-limit)
 
如下,ByteBuffer.asCharBuffer():
     ByteBuffer中的两个字节映射成CharBuffer中的一个字符,CharBuffer中的字节排序不可以再改变。
 
数据元素视图:
以多字节数据形式存取byte数据组,存取和转化:
从ByteBuffer的当前位置存取字节数据,根据缓冲区当前的有效字节数序,字节会被排列或打乱成原始的数据类型。
例如getInt(),从当前位置开始的四个字节会被包装成一个Int返回。如下:
 
映射缓冲区(MappedByteBufefer):
通过内存映射存取元素的字节缓冲区,直接存取内存,只能通过FileChannel类创建。

JAVA NIO Buffer的更多相关文章

  1. Java NIO Buffer(netty源码死磕1.2)

    [基础篇]netty源码死磕1.2:  NIO Buffer 1. Java NIO Buffer Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.Buffer缓冲区本质上是一块可 ...

  2. (二:NIO系列) Java NIO Buffer

    出处:Java NIO Buffer Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.Buffer缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO ...

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

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

  4. [翻译] java NIO Buffer

    原文地址:http://tutorials.jenkov.com/java-nio/buffers.html JAVA NIO 是在和channel交互的时候使用的.正如你所知道的,数据是从chann ...

  5. Java NIO Buffer缓冲区

    原文链接:http://tutorials.jenkov.com/java-nio/buffers.html Java NIO Buffers用于和NIO Channel交互.正如你已经知道的,我们从 ...

  6. java NIO Buffer 详解(1)

    1.java.io  最为核心的概念是流(stream),面向流的编程,要么输入流要么输出流,二者不可兼具: 2.java.nio 中拥有3个核心概念: Selector Channel, Buffe ...

  7. Java NIO —— Buffer(缓冲区)

    Buffer是一个抽象类,位于java.nio包中,主要用作缓冲区.注意:Buffer是非线程安全类. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer ...

  8. Java NIO Buffer说明

    Buffer 有3个重要的参数:位置(position).容量(capactiy).上限(limit) 位置(position): 写:当前缓冲区的位置,将从position的下一个位置写数据. 读: ...

  9. java.nio.Buffer源码阅读

    Java 自从 JDK1.4 起,对各种 I/O 操作使用了 Buffer 和 Channel 技术.这种更接近于操作系统的的底层操作使得 I/O 操作速度得到大幅度提升,下面引用一段<Java ...

  10. Java NIO ———— Buffer 缓冲区详解 入门

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

随机推荐

  1. Flux 普及读本

    话说当时做 APP 时,三月不知肉味,再次将眼光投放前端,有种天上一天,地下一年的感觉. Flux 是一种思想 了解的最好方式当然是看Flux官方文档了.React 中文站点也能找到对应的翻译版本,但 ...

  2. 轻量级表达式树解析框架Faller

    有话说 之前我写了3篇关于表达式树解析的文章 干货!表达式树解析"框架"(1) 干货!表达式树解析"框架"(2) 干货!表达式树解析"框架" ...

  3. java的继承练习

     看程序写结果:    A:一个类的静态代码块,构造代码块,构造方法的执行流程    静态代码块 > 构造代码块 > 构造方法   B:静态的内容是随着类的加载而加载    静态代码块的内 ...

  4. 空中网招聘Java架构师、数据库开发等各类人才

    爱好网络游戏吗?爱好网站开发技术吗? 有没有想过可以成为史诗级MMO RPG<激战2>运营团队中的一员? 如果下面的职位有合适你的,加入我们吧! http://gw2.kongzhong. ...

  5. react+redux教程(七)自定义redux中间件

    今天,我们要讲解的是自定义redux中间件这个知识点.本节内容非常抽象,特别是中间件的定义原理,那多层的函数嵌套和串联,需要极强逻辑思维能力才能完全消化吸收.不过我会多罗嗦几句,所以不用担心. 例子 ...

  6. JS组件系列——Bootstrap文件上传组件:bootstrap fileinput

    前言:之前的三篇介绍了下bootstrap table的一些常见用法,发现博主对这种扁平化的风格有点着迷了.前两天做一个excel导入的功能,前端使用原始的input type='file'这种标签, ...

  7. PHP的学习--在Atom中使用XDebug(Mac)

    之前写过一篇博客<PHP的学习--在sublime中使用XDebug(Ubuntu)>,讲了在Ubuntu系统 sublime 中配置 XDebug,其实配置好之后,我也很少用,原因有两点 ...

  8. 注意 AppResLib.dll.*.mui 的生成操作应该为 Content

    为 Windows Phone 8 App 添加本地化的时候,发现修改 AppResLib.dll.*.mui 后不仅没有其变化,还发现修改它导致它失效.通过对比代码发现,问题原因是 AppResLi ...

  9. 深入理解定时器系列第一篇——理解setTimeout和setInterval

    × 目录 [1]setTimeout [2]setInterval [3]运行机制[4]作用[5]应用 前面的话 很长时间以来,定时器一直是javascript动画的核心技术.但是,关于定时器,人们通 ...

  10. Linq查询基本操作

    摘要:本文介绍Linq查询基本操作(查询关键字) - from 子句 - where 子句 - select子句 - group 子句 - into 子句 - orderby 子句 - join 子句 ...