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

硬件不能直接访问用户控件(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. 【初学者指南】在ASP.NET MVC 5中创建GridView

    介绍 在这篇文章中,我们将会学习如何在 ASP.NET MVC 中创建一个 gridview,就像 ASP.NET Web 表单中的 gridview 一样.服务器端和客户端有许多可用的第三方库,这些 ...

  2. 数据库中树形列表(以easyui的tree为例)

    构造一棵easyui前台框架的一个树形列表为例后台框架是spring MVC+JPA. 先看一下数据库是怎么建的,怎么存放的数据 下面是实体类 /** * 部门类 用户所属部门(这里的部门是一个相对抽 ...

  3. 在PC上测试移动端网站和模拟手机浏览器的5大方

    查了很多资料,尝试了大部分方法,下面将这一天的努力总结下分享给大家,也让大家免去看那么多文章,以下介绍的方法,都是本人亲自测试成功的方法,测试环境winxp. 一.Chrome*浏览器 chrome模 ...

  4. SQL Server中TOP子句可能导致的问题以及解决办法

    简介      在SQL Server中,针对复杂查询使用TOP子句可能会出现对性能的影响,这种影响可能是好的影响,也可能是坏的影响,针对不同的情况有不同的可能性.      关系数据库中SQL语句只 ...

  5. Chrome在302重定向的时候对原请求产生2次请求的问题说明

    这个问题应该确确实实是一个Chrome的BUG,我在自己的编程环境中发现,并在多个服务器,多个编程语言的运行环境,以及多个浏览器下都测试过,都看到有2次请求出现.为了证明不是自己环境的问题,我也特意去 ...

  6. HTML5 学习总结(四)——canvas绘图、WebGL、SVG

    一.Canvas canvas是HTML5中新增一个HTML5标签与操作canvas的javascript API,它可以实现在网页中完成动态的2D与3D图像技术.<canvas> 标记和 ...

  7. 【知识积累】try-catch-finally+return总结

    一.前言 对于找Java相关工作的读者而言,在笔试中肯定免不了遇到try-catch-finally + return的题型,需要面试这清楚返回值,这也是这篇博文产生的由来.本文将从字节码层面来解释为 ...

  8. html+ccs3太阳系行星运转动画

    做一个太阳系八大行星的运转动画,不包括行星的卫星,所有行星围绕太阳公转,行星采用纯色,暂时没有自转. 效果静态图: 动画中包括:太阳及各行星,运行轨道,行星公转动画. 先画好草图,设计好大小和位置,根 ...

  9. Entity Framework 教程——创建实体数据模型

    创建实体数据模型: 本文将带你创建实体数据模型(EDM)SchoolDB数据库和理解基础建设模块. 实体数据模型(EDM)是用于描述实体之间关系的一种模型,以下将使用Visual Studio 201 ...

  10. [C1] C1FlexGrid 排除非绑定列的验证效果

    一.前言 前提是 C1FlexGrid 中存在数据绑定列和自定义列(非数据绑定列),此时如果该行编辑后出现排他错误,自定义列也会出现验证结果的红色边框: 但是自定义列如果只是一些按钮操作,提示说明什么 ...