说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Android开发进阶之NIO非阻塞包(二)

HTML文档下载 WORD文档下载 PDF文档下载
Android开发进阶之NIO非阻塞包(二)

作者:Android开发网


   有关Android NIO我们主要分为三大类,ByteBuffer、FileChannel和SocketChannel。由于篇幅原因今天Android123只对前两个做说明。NIO和传统的I/O比较大的区别在于传输方式非阻塞,一种基于事件驱动的模式,将会使方法执行完后立即返回,传统I/O主要使用了流Stream的方式,而在New I/O中,使用了字节缓存ByteBuffer来承载数据。

   ByteBuffer位于java.nio包中,目前提供了Java基本类型中除Boolean外其他类型的缓冲类型,比如ByteBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer和ShortBuffer  。同时还提供了一种更特殊的映射字节缓冲类型MappedByteBuffer。在传统IO的输入输出流中,InputStream中只提供了字节型或字节数组的访问对应NIO就是ByteBuffer,但是处理传统的DataInputStream的int等类型,就是IntBuffer,但是缓冲类型并没有提供UTF这样的类型处理,所以我们仍然需要使用ByteBuffer处理字符串,但是NIO提供了一个封装的类在java.nio.charset包中,通过字符的编码CharsetEncoder和解码CharsetDecoder类来处理字符串,同时这些类可以方便转换编码比如GBK或UTF等等。

  一、ByteBuffer类

  1) 实例化

  直接使用ByteBuffer类的静态方法static ByteBuffer allocate(int capacity) 或 static ByteBuffer allocateDirect(int capacity)  这两个方法来分配内存空间,两种方法的区别主要是后者更适用于繁复分配的字节数组。而 put(ByteBuffer src) 可以从另一个ByteBuffer中构造,也可以通过wrap方法从byte[]中构造,具体参考下面的类型转化内容。

  2) 类型转化

   ByteBuffer可以很好的和字节数组byte[]转换类型,通过执行ByteBuffer类的final byte[]  array() 方法就可以将ByteBuffer转为byte[]。从byte[]来构造ByteBuffer可以使用wrap方法,目前Android或者说Java提供了两种重写方法,比如为static ByteBuffer  wrap(byte[] array)  和 static ByteBuffer  wrap(byte[] array, int start, int len)  ,第二个重载方法中第二个参数为从array这个字节数组的起初位置,第三个参数为array这个字节数组的长度。

  3) 往ByteBuffer中添加元素

  目前ByteBuffer提供了多种put重写类型来添加,比如put(byte b) 、putChar(char value) 、putFloat(float value) 等等,需要注意的是,按照Java的类型长度,一个byte占1字节,一个char类型是2字节,一个float或int是4字节,一个long则为8字节,和传统的C++有些区别。所以内部的相关位置也会发生变化,同时每种方法还提供了定位的方法比如ByteBuffer  put(int index, byte b) 

  4) 从ByteBuffer中获取元素

  同上面的添加想法,各种put被换成了get,比如byte  get()  、float  getFloat()  ,当然了还提供了一种定位的方式,比如double  getDouble(int index) 

  5) ByteBuffer中字节顺序

  对于Java来说默认使用了BIG_ENDIAN方式存储,和C正好相反的,通过

  final ByteOrder  order() 返回当前的字节顺序。

  final ByteBuffer  order(ByteOrder byteOrder)  设置字节顺序,ByteOrder类的值有两个定义,比如LITTLE_ENDIAN、BIG_ENDIAN,如果使用当前平台则为ByteOrder.nativeOrder()在Android中则为 BIG_ENDIAN,当然如果设置为order(null) 则使用LITTLE_ENDIAN。

  二、FileChannel类

   在NIO中除了Socket外,还提供了File设备的通道类,FileChannel位于java.nio.channels.FileChannel包中,在Android SDK文档中我们可以方便的找到,对于文件复制我们可以使用ByteBuffer方式作为缓冲,比如

  String infile = "/sdcard/cwj.dat";
  String outfile = "/sdcard/android123-test.dat";

    FileInputStream fin = new FileInputStream( infile );
    FileOutputStream fout = new FileOutputStream( outfile );

    FileChannel fcin = fin.getChannel();
    FileChannel fcout = fout.getChannel();

    ByteBuffer buffer = ByteBuffer.allocate( 1024 ); //分配1KB作为缓冲区

    while (true) {
    buffer.clear(); //每次使用必须置空缓冲区

      int r = fcin.read( buffer );

      if (r==-1) {
        break;
      }

   buffer.flip(); //写入前使用flip这个方法

      fcout.write( buffer );
    }

   flip和clear这两个方法是java.nio.Buffer包中,ByteBuffer的父类是从Buffer类继承而来的,这点Android123要提醒大家看Android SDK文档时注意Inherited Methods,而JDK的文档就比较直接了,同时复制文件使用FileChannel的transferTo(long position, long count, WritableByteChannel target) 这个方法可以快速的复制文件,无需自己管理ByteBuffer缓冲区。明天Android开发网介绍NIO主要的Socket相关的内容。

智能家居升级:Nest启动开发者计划,并开放API Docker,从这里做起! 《近匠》云巴创始人张虎:低门槛云服务为小团队创造更多机会 Oculus公司同意收购Xbox 360手柄设计团队 公有云VS私有云 哪个数据更安全? 调查:开发者越老越吃香吗? Facebook在线支付:取代虚拟货币的终极边界 Google I/O前析:关于新一代设计框架Quantum Paper的猜想 Google I/O 2014前瞻:“令人发指”的Android产品线 福昕熊雨前:PDFium开源项目的背后 Dropbox无法登陆,国内企业网盘横向评测! 如果编程语言是超级英雄…… 谷歌发布Material Design设计语言 系统、功能与设计,Android L究竟新在哪儿? 《近匠》游道易副总裁孙可:发行商眼中的手游市场 布道师徐立:Docker是标准化IT结构的新方式 解读全新Google Play Games:多屏游戏时代终于来了! 设计神器PaintCode 2.1发布,完全支持Swift 一周消息树:天河二号以每秒3.3亿亿次的速度再居世界超算榜首 传闻微软计划用Lumia品牌取代Surface 【CTO俱乐部读书会】杨立东:技术团队留人“三板斧” 蓝港在线王世颖:浅谈手机游戏发行的成功基因 美国高通公司执行董事长Paul E. Jacobs:移动科技——精彩现在,辉煌未来 告别公用云,Instagram已将服务迁至Facebook数据中心 华为助力凤凰实现全媒体战略 跨平台2D/3D游戏开发框架libGDX发布1.2.0更新 Docker CEO Ben Golub:Docker借助开源、天时走向成功 社交网络先驱、服役十年的Orkut被谷歌关闭 支付宝风控系统对外输出 联合机构建支付安全生态圈 不同设备不同界面:Windows 9正在逼近! 福特联手英特尔 为汽车打造智慧感应系统 紧急援助——莫名奇妙的关于编译后的EXE文件图标的问题 需求和方案方面的资料 C#写的windos桌面程序中调用delphi6写的dll正常,为何在阿asp.net中相同的方法调用出现问题呢? SQL语句的语法问题,高手请进!!! 有一套网上音像系统,寻开音像店共同合作 SUN的那份关于java所有的包的说明的文档在哪里可以下载呀? 怎么用电脑接听普通电话机打来的电话。 为什么读取图片后显示出错 请各位指教关于随即生成表格的问题!(急!!!!!) 格式问题:高分! 今天新买一台机器,xp1800+ 承启nforce2 +Kingmax333 256DDR +ST80G用起来一个字,爽! RichTextBox控件如何读取使用UTF8编码的文本文件? 程序编译到AfxWinMain就显示警告信息 建设一个一般的callcenter有10-20坐席,大概需多少钱呀 散分!!第一个程序在天空提交通过!! (帮我搞定,高分相赠,在线等待!)ASP上传图片到SQLServer,为什么老提示对象不支持appendchunkmydata方法? CheckBox可以同时传递多个值吗? 请问有用过visual interdev的,如何让interdev也像dreamweaver可以在写程序的时候显示代码在哪行的啊.多谢了 请高手帮忙解决我的问题,在此表示谢谢! 有关datagrid 和webform 的问题 程序员的艳遇。。。。。。 验证字符串问题 IE问题!好烦人啊!那位高手能帮我解答! 怎么在建表时使用一个时间函数??就是指出加这条这条文件的时间?? 高手请进,多数据库链接的问题 如何成为一个程序员? 事务以及回滚的问题 有做完一个作业,放60分。 关于ASP调用VC编的DLL接收返回参数的问题 我提问,大家回答 有没有关于触发器的电子书籍? 怎么能够获得数据库的连接字串呀?? 大讨论:目前用什么工具、做什么开发最能赚钱?散分啦!感兴趣的程序员们快来!! 在IE中,打开某个页面,会连接到www.lop.com页面 关于islower(ch),isdigit(ch) 疑问 BQQ的服务器端有没有保存用户的聊天记录的? 如何获得程序方向键输入?多谢! 求助有关IFS-HOOK 高手请入!!急救!求msflexgrid 的打印源码????? 如何在list中显示文件夹 哪里可以看到Obejct类clone的实现方法? 系统的FOUND.00*文件夹里放的FILE000*是什么文件?可以删除吗?刚装系统时没有这些文件的阿 给分啊 今日郁闷之至……散分! 来来来,大伙们一起来衷心祝愿xxmm (晓箫)的老爸老妈顺利赴美参加晓箫的毕业典礼!! Dev-Cpp 使用 NetAPI32.lib 的问题 急寻严蔚敏,吴伟民版《数据结构习题集》c语言版的答案,请问哪有啊 高手们给我一个超级简单的HOOK API的例子好吗?求你们了。 “身为一道彩虹,雨后的天空.”是什么歌!迪克牛仔唱过的 彼亦一是非,此亦一是非 用哲学的观点如何回答? I don‘t like ( )(orange). 用所给括号里单词适当形式填空 一歌的歌词是 雨后的天空有一道彩虹和雨后的天空有一些迷茫,女的唱的看动画《秦时明月》听到的歌名是什么啊?还有一句是雨后的天空有一些迷茫 笑的很淫荡是什么意思?同学说我笑的很淫荡,也有同学说我笑的很泛滥,到底是什么意思啊?大家要详细点,这是好还是坏啊,我也知道是开玩笑的啦,可是我就想知道什么才叫笑的淫荡呢?淫荡不 为什么鲸和海豚都不是鱼? You stir with this.猜一个以s开头的英文单词 天边一道彩虹,男声唱的一首歌,谁知道歌名? 故不登高山不知天之高也?故不登高山不知天之高也,不临深溪不知地之厚也,不问先生遗言故不知学问之深也.撒意思哦 四个火念神马 雨后的天空 有一点不同 小小的我们 有一点冲动 这什么歌? “故不登高山,不知天之高也”后两句是什么? 神马字? 将以下名词的复数形式填入正确的栏目内.mechanic\knife\neighbour\housewife\house\garage attendant\shop assistant\lamp-post\car\day\garge\crash\cinema\city\film\suitcase\woman\vegetable\child/s/sound:/z/sound:/iz/sound:irregular:garage Him,this,her的复数? 狐死归首丘,故乡安可忘.的意思 将一下名词的复数形式填入正确的栏目里mechanic knife neighbour housewife house garge attendant shopassistant lamp -post car day garage crash cinema city film suitcase woman vegetable child 要快好得多加赏!急 where is my handbag?----Maybe you < >it in the shoe store.A.left B.forget C.threw D.got 这是神马字 the girl__a book in the garden ,while a boy ran to her. 为什么百度哲学贴吧,有这么多头脑有问题的人为什么百度哲学贴吧这么多头脑有问题,极度自恋,没读过多少书或者读过几本书就开始扑腾他们那脆弱的翅膀了强烈建议取消那个吧的吧主位置. 蔡依林又为何躺枪? we are playing football (happy) on the playground用适当形式填空 ( )( )( )the shoe store 括号填? 这个是神马字? The girl ran up to me,barely able to catch her breath.女孩跑向我,跑得上气不接下气.able 前面可以不加be的吗? red的同类词v打头单词 运用所给句型翻译下列句子 The little girl was willing to try her best at the begining,but soon she ran away.哪里错了? 哲学到底是什么?简单通俗的描述吧 Peter didn't ( )lunch yesterday. A,ate B.had C.did D.eat hear from的同义词英文翻译 如何的作息 是做科学的? pancake可数吗 hear from 的同义词 八分之一除以三加三分之一乘八分之七=( )=( ) Because L can eat ice-cream in summer是什么意思 hear from的同义词 两个,没有的,一个也行 为了他的尊严独臂乞丐如何走向成功 pancake forging是什么意思 这道题是不是出错了啊?How ( ) is your teacher?A.am B.is C.are D.be 为了他的尊严 这个独臂乞丐是如何走向成功的(想象 用挂起造句比喻句 改换grandma这个单词的一个字母,使它变成另一个单词. RED LIGHT怎么样 挂起,露出造句 氧化钙是什么?有什么用? as what has been expected话这句对吗?但是两个连词为什么可以放在一起用?求分析一下这句话的语法成分 用挂 ……就……造句什么一挂出来就怎么样 蜗牛的有什么用? red light subway libray canada 写出所写单词和词组的同项 挂起,露出,造句 蜗牛的触角有什么用 The boy has been made what he is.谓语是哪部分? 用别造句:表示其他 表示挂着、插着 蜗牛液体有什么作用 语法 A city has been set up in what was once a wasteland.请分析下结构A city has been set up in what was a wasteland.请分析下结构“in what was once a wasteland”做地点状语“what was once a wasteland”做什么成分,请分析下 In summer we all like to eat i cream 为什么蚯蚓背面颜色深,腹面颜色浅? I've been up and down (uh, what) 怎樣翻譯? 一名越南籍变性人涉嫌贩毒被马来西亚警普京称索契冬奥会欢迎任何性取向的人参法国女婴在后备箱被发现 躺在排泄物中法国女婴在后备箱被发现 躺在排泄物中澳大利亚维州采取强硬措施整治司机开车日本明仁天皇夫妇将首次访印 前首相森执政联盟候选人赢得格鲁吉亚总统选举美被曝一月内监听西班牙超6000万个纽约华裔社区灭门案震惊美国 凶手提审迪拜将推出专供叫车服务出租车迪拜将推出专供叫车服务出租车土耳其青睐中国防控系统向西方国家扇了日本诺贝尔医学奖得主为募资发薪水跑马穆兄会领导人将首次在埃及受审 原定于为表彰军犬贡献 美军方为军犬设国家纪日本一男子摔死1岁女儿 只因其哭闹不德国男子以点燃自家公寓要胁 欲与市长英国男子涉嫌窃取美机密 自称能“搞死全球首次大规模男性裸体展 法国美术展英国国家打击犯罪局欲聘400名赛博情卫计委回应放开单独生二胎新闻:政策无关于开放的边界和规则,腾讯真的想明白森林狼有意尼古拉-米卢蒂诺夫?“妖股”特力A、海欣食品停牌前游资出保罗:第五场我们会更渴望胜利但你没有……罗杰斯加仓A股 称重返5000点只是面对记者,C罗给嘴唇“拉拉链”这年头小姨子也不好当啊。。一不小心就年薪10万 国企“三无”青年如何理财小王子的故事太可爱的结婚协议啦!亲爱的我们也来一中秋国庆双节来临餐饮旅游等五板块分享“税负痛苦指数”全球第二位,你HOL请原谅我放荡不羁笑点低~~沪指盘整题材活跃 国庆前筑底行情将持360手机,周鸿祎满满的都是情怀笑尿了!晒晒iPhone6的朋友圈李志林:自我修复非一朝之功 配资对大巧用眉妆优化面部比例 打造心机小脸致我所有的微信好友私募:市场有望酝酿跨年度中级大反弹行
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘