NIO(二、Buffer)】的更多相关文章

当我们需要与 NIO Channel 进行交互时, 我们就需要使用到 NIO Buffer, 即数据从 Buffer读取到 Channel 中, 并且从 Channel 中写入到 Buffer 中.缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存. 缓冲区基础 Buffer 类型有: 缓冲区是包在一个对象内的基础数据的数组,Buffer类相比一般简单数组而言其优点是将数据的内容和相关信息放在一个对象里面…
一 Buffer(缓冲区)介绍 Java NIO Buffers用于和NIO Channel交互. 我们从Channel中读取数据到buffers里,从Buffer把数据写入到Channels. Buffer本质上就是一块内存区,可以用来写入数据,并在稍后读取出来.这块内存被NIO Buffer包裹起来,对外提供一系列的读写方便开发的接口. 在Java NIO中使用的核心缓冲区如下(覆盖了通过I/O发送的基本数据类型:byte, char.short, int, long, float, dou…
Java NIO 之 Buffer Java NIO (Non Blocking IO 或者 New IO)是一种非阻塞IO的实现.NIO通过Channel.Buffer.Selector几个组件的协同实现提升IO效率的目的.而ByteBuffer是其中最基础的一种Buffer实现. 阻塞 or 非阻塞 阻塞/非阻塞,同步/异步是两组非常容易产生混淆的概念. 同步/异步:是从消息通信机制的划分,如果调用者在没有得到结果前"调用"不返回,则是同步的.而如果调用发出后,调用直接返回,结果由…
​ Java NIO中的缓存区(Buffer)用于和通道(Channel)进行交互.数据是从通道读入缓冲区,从缓冲区写入到通道中的. ​ 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存. ​ Buffer底层使用数组实现. 1.NIO 数据读取基本操作示意 2.Java NIO中Buffer类型 ​ Java NIO中,根据数据类型不同(boolean 除外),提供了相应类型的缓冲区: ByteBuf…
Buffer是一个包装了基本数据元素数组的对象,它以及它的子类定义了一系列API用于处理数据缓存. 一.属性 Buffer有四个基本属性: 1.capacity  容量,buffer能够容纳的最大元素数目,在Buffer创建时设定并不能更改 2.limit buffer中有效位置数目 3.position 下一个读或者写的位置 4.mark  用于记忆的标志位,配合reset()使用,初始值未设定,调用mark后将当前position设为值 四者关系:0 <= mark <= position…
package com.slp.nio; import org.junit.Test; import java.nio.ByteBuffer; /** * Created by sanglp on 2017/3/1. * 一.缓冲区:在Java nio中负责数据的存储.缓冲区就是数据,用于村塾不同数据类型的数据 * 根据数据类型的不同(boolean类型除外),提供了相应类型的缓冲区 * ByteBuffer * CharBuffer * ShortBuffer * IntBuffer * Fl…
一.JAVA NIO 是在和channel交互的时候使用的.Channel将数据读入缓冲区,然后我们又从缓冲区访问数据.写数据时,首先将要发送的数据按顺序填入缓冲区.基本上,缓冲区只是一个列表,它的所有元素都是基本数据类型(通常为字节型). 二.Buffer的实现有下面几种(ByteBuffer是比较常用的,这里也只介绍ByteBuffer) ByteBuffer CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer ShortBuff…
一.前言熟悉NIO的人想必一定不会陌生buffer中position,limit,capacity这三个属性吧,之前在学习的时候遇到一个问题:就是当你先往缓冲区写入一部分数据,然后调用flip()方法,再全部读取完数据,然后再调用flip()方法,此时这三个值的变化是怎样的,研究了一下,决定写下来分享一下. 二.正文1.介绍 position: 它指的是下一次读取或写入的位置. limit: 指定还有多少数据需要写出(在从缓冲区写入通道时),或者还有多少空间可以读入数据(在从通道读入缓冲区时),…
一.分散/聚集 Scatter/Gather scatter/gather指的在多个缓冲区上实现一个简单的I/O操作,比如从通道中读取数据到多个缓冲区,或从多个缓冲区中写入数据到通道:scatter(分散):指的是从通道中读取数据分散到多个缓冲区Buffer的过程,该过程会将每个缓存区填满,直至通道中无数据或缓冲区没有空间:gather(聚集):指的是将多个缓冲区Buffer聚集起来写入到通道的过程,该过程类似于将多个缓冲区的内容连接起来写入通道: scatter/gather接口如下是Scat…
一.Channel概述 channel(通道):进行IO的连接通道,为NIO的几个核心(Buffer,selector,channel)之一,相比于IO的stream具有较高的性能. IO 单向传输 NIO 异步双向传输 使用时需要和buffer(缓冲区一切使用),将数据暂存入Buffer中,通过channel通道连接传输buffer以此传输数据. 二.channel继承结构 其中主要的几个实现类如下: FileChannel: 本地文件传输通道 SocketChannel: 通过TCP传输通道…
IO  是主存和外部设备 ( 硬盘.终端和网络等 ) 拷贝数据的过程. IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成. Java标准io回顾 在Java1.4之前的I/O系统中,提供的都是面向流的I/O系统. InputStream\OutputStream( 字节流 ) :一次传送一个字节. Reader\Writer( 字符流 ) :一次一个字符. NIO nio 是java nonblocking(非阻塞) IO 的简称(还有种解释是 New IO),在jdk1.4 里提…
缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存,这块内存中有很多可以存储byte(或int.char等)的小单元.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存. 为了理解Buffer的工作原理,需要熟悉它的三个属性: capacity position limit 简单的解释这三个属性的含义可以概括为:capacity代表这块Buffer的容量,position代表下一次读(或写)的位置,limit代表本次读(或写)的极限位置.这么简单说一下你当…
一.内存文件映射 内存文件映射允许我们创建和修改那些因为太大而不能放入内存中的文件.有了内存文件映射,我们就可以假定整个文件都在内存中,而且可以完全把文件当作数组来访问. package com.dy.xidian; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; public class LargeMappedFiles { stat…
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存. 1. Buffer的基本用法 使用Buffer读写数据一般遵循以下四个步骤: (1)写入数据到Buffer (2)调用flip()方法:前面写入数据到Buffer的时候,指针到达了Buffer末尾,这里需要使用flip()反转一下,将缓…
java.nio  --- 定义了 Buffer 及其数据类型相关的子类.其中被 java.nio.channels 中的类用来进行 IO 操作的 ByteBuffer 的作用非常重要. java.nio.channels----定义了一系列处理 IO 的 Channel 接口以及这些接口在文件系统和网络通讯上的实现.通过 Selector 这个类,还提供了进行非阻塞 IO 操作的办法.这个包可以说是 NIO API 的核心. java.nio.channels.spi----定义了可用来实现…
1. 缓冲区(Buffer): 介绍 我们知道在BIO(Block IO)中其是使用的流的形式进行读取,可以将数据直接写入或者将数据直接读取到Stream对象中,但是在NIO中所有的数据都是使用的换冲区进行处理的,任何时候访问NIO的数据都是通过缓冲区进行操作的. 实质: 从下面的源码我们可以看到其实这个里面的ByteBuffer其实里面是一个数组,然后提供了一个offset的变量用于对数据进行结构化的访问以及维护读写为位置等信息. public abstract class ByteBuffe…
缓冲区(Buffer): 一个用于特定基本数据类型的容器.由 java.nio 包定义的,所有缓冲区都是 Buffer 抽象类的子类.Java NIO 中的 Buffer 主要用于与 NIO 通道进行交互,数据是从通道读入缓冲区,从缓冲区写入通道中的. Buffer 就像一个数组,可以保存多个相同类型的数据.根据数据类型不同(boolean 除外) ,有以下 Buffer 常用子类:ByteBufferCharBuffer ShortBuffer IntBuffer LongBuffer Flo…
java的NIO和AIO Buffer position.limit.capacity 初始化 Buffer 填充 Buffer 提取 Buffer 中的值 mark() & reset() rewind() & clear() & compact() Channel FileChannel SocketChannel ServerSocketChannel DatagramChannel Selector Buffer 一个 Buffer 本质上是内存中的一块,我们可以将数据写入…
Java的NIO中有关Buffer的几种常用方法比如clear,rewind和flip到底有哪些区别.下面给大家这三种方法的源码,方便大家记忆.clear()方法用于写模式,其作用为情况Buffer中的内容,所谓清空是指写上限与Buffer的真实容量相同,即limit==capacity,同时将当前写位置置为最前端下标为0处.代码如下: public final Buffer clear() { position = 0; //设置当前下标为0 limit = capacity; //设置写越界…
Buffer 一个 Buffer 本质上是内存中的一块,我们可以将数据写入这块内存,之后从这块内存获取数据. java.nio 定义了以下几个 Buffer 的实现,这个图读者应该也在不少地方见过了吧. 其实核心是最后的 ByteBuffer,前面的一大串类只是包装了一下它而已,我们使用最多的通常也是 ByteBuffer. 我们应该将 Buffer 理解为一个数组,IntBuffer.CharBuffer.DoubleBuffer 等分别对应 int[].char[].double[] 等.…
Buffer简单介绍 Buffer意为缓冲区.其本质上就是是一块可写入数据,然后能够从中读取数据的内存区域.通过该种方式有助于降低系统开销和提高外设效率.对于缓冲区我们早有所了解,比方在C中标准I/O中的read,write直接调用系统的输入输出.而scanf和printf则借助缓冲区在适当的时候调用read.write操作.在NIO中,为了方便对缓冲区的操作.jAVA设计者将缓冲区封装为Buffer(实际上就是封装了基本数据元素的数组),并提供对应的方法对其操作. 在開始之前,首先须要明确下面…
Buffer 是java NIO中三个核心概念之一 缓存, 在java的实现体系中Buffer作为顶级抽象类存在 简单说,Buffer在做什么? 我们知道,在java IO中体系中, 因为InputStream和OutputStream是抽象类,而java又不可以多重继承,于是任何一个流要么只读,要么只写.而无法完成同时读写的工作 于是: Buffer来了 NIO中,对数据的读写,都是在Buffer中完成的,也就是说,同一个buffer我们可以先读后写, 它底层维护着一个数组,这个数组被三个重要…
Java NIO中的Buffer用于和NIO通道进行交互.如你所知,数据是从通道读入缓冲区,从缓冲区写入到通道中的. 缓冲区本质上是一块可以写入数据,然后可以从中读取数据的内存.这块内存被包装成NIO Buffer对象,并提供了一组方法,用来方便的访问该块内存. 使用Buffer读写数据步骤: 写入数据到Buffer 调用flip()方法 从Buffer中读取数据 调用clear()方法或者compact()方法 flip()方法将Buffer从写模式切换到读模式.在读模式下,可以读取之前写入到…
参考:https://blog.csdn.net/xialong_927/article/details/81044759 缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区: 使用缓冲区有这么两个好处: 1.减少实际的物理读写次数 2.缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数 举个简单的例子,比如A地有1w块砖要搬到B地 由于没有工具(缓冲区),我们一次只能搬一本,那么…
NIO 介绍 NIO,可以说是New IO,也可以说是non-blocking IO,具体怎么解释都可以. NIO 1是在JSR51里面定义的,在JDK1.4中引入,因为BolckingIO不支持高并发网络编程,这也是Java1.4以前被人诟病的原因.NIO 2是在JSR203中定义的,在JDK1.7中引入,这是JavaNIO整个的发展历程.NIO 1和NIO 2并不是一个新旧替代的关系,而是一个补充的关系,NIO 2补充了1中缺少的一些东西.我们可以看一下两个的内容: NIO 1(本系列文章只…
重要属性 属性 描述 Capacity 容量, 即可以容纳的最大数据量; 在缓冲区创建时被设定并且不能改变 Limit 表示缓冲区的当前终点, 不能对缓冲区超过极限的位置进行读写操作, 且极限是可以修改的. Position 位置, 下一个要被读或写的元素的索引, 每次读写缓冲区数据时都会改变数值, 为下次读写做准备 Mark 标记 简单demo 代码: package com.ronnie.nio; import java.nio.IntBuffer; public class BasicBu…
目录 Buffer简介 Buffer的核心属性 Buffer的创建与使用(ByteBuffer为例) 总结 参考资料 Buffer简介 缓冲区(Buffer):本质上是一个数组,用于临时保存.写入以及读取数据.在Java NIO中, 该内存块包含在NIO Buffer对象当中,NIO Buffer对象还提供了一组接口来访问该内存块. 根据数据类型的不同,Java为除了boolean类型之外的其余7种基本类型提供了相应类型的缓冲区, 分别是ByteBuffer.CharBuffer.ShortBu…
缓冲区 Buffer 是 Java NIO 中一个核心概念,它是一个线性结构,容量有限,存放原始类型数据(boolean 除外)的容器. 1. Buffer 中可以存放的数据类型 java.nio.Buffer 是一个接口,有 7 个重要的子类,对应着 7 种(除 boolean 外)原始数据类型:IntBuffer, CharBuffer, FloatBuffer, DoubleBuffer, ShortBuffer, LongBuffer, ByteBuffer. .st22 {fill:#…
在默认情况下,Buffer.mark()并没有什么用处,既不会影响Buffer的遍历,也不会影响Buffer的位置统计函数,如remaining()函数,能影响这些操作的行为只有position(). 位置统计示例代码如下: CharBuffer buffer = CharBuffer.allocate(10); buffer.put('你'); buffer.put('好'); // 直接跳转位置 buffer.position(5); // 现在剩余的缓冲区只有5了 assertThat(b…
假设某银行只有10个职员.该银行的业务流程分为以下4个步骤: 1) 顾客填申请表(5分钟): 2) 职员审核(1分钟): 3) 职员叫保安去金库取钱(3分钟): 4) 职员打印票据,并将钱和票据返回给顾客(1分钟). 我们看看银行不同的工作方式对其工作效率到底有何影响. 1 BIO方式 每来一个顾客,马上由一位职员来接待处理,并且这个职员需要负责以上4个完整流程.当超过10个顾客时,剩余的顾客需要排队等候. 我们算算这个银行一个小时到底能处理多少顾客?一个职员处理一个顾客需要10分钟(5+1+3…