NIO基础知识

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初始化后属性情况

Buffer的相关常用方法

put():向缓冲区存放数据
例:
byteBuffer.put("hello".getBytes());

Buffer存放数据

flip():切换缓冲区的读写状态,例:
byteBuffer.flip();
Buffer状态转换

get():从缓存区获取数据,例:
byteBuffer.get();
Buffer读取数据

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

mark():将缓冲区属性position的当前取值赋给属性mark,例:
byteBuffer.get();
byteBuffer.mark();
byteBuffer.get();
Buffer标记

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

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

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)方法进行声明

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 转自 http://www.ibm.com/developerworks/cn/education/java/j-...
    抓兔子的猫阅读 2,306评论 0 22
  • Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java I...
    JackChen1024阅读 7,555评论 1 143
  • 原文地址http://www.importnew.com/19816.html 概述 NIO主要有三个核心部分:C...
    期待现在阅读 864评论 0 4
  • 前言: 之前的文章《Java文件IO常用归纳》主要写了Java 标准IO要注意的细节和技巧,由于网上各种学习途径,...
    androidjp阅读 2,903评论 0 22
  • Buffer java NIO库是在jdk1.4中引入的,NIO与IO之间的第一个区别在于,IO是面向流的,而NI...
    德彪阅读 2,202评论 0 3