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

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相关的内容。

改变企业移动化:新Google地图API支持用户定制 诺基亚旗舰手机EOS真机图曝光 配备“巨型”摄像头 走进豆瓣:豆瓣的技术架构与团队文化分享 加速Web开发的10款HTML5工具 微软式微?AMD、英特尔等开始疏远Windows 语音技术现状:四千万突破语音产业的技术壁垒? 万维网联盟W3C推荐Web性能API 微软郑子颖:Windows Azure如何支持开源系统和软件? EMC 叶成辉:软件定义数据中心实现统一、开放的管理 百度云主任架构师 侯震宇:云终端开启数字生活 中国工程院院士 倪光南:中国云计算在全世界份额远超3% 信息图:未来的企业移动培训应用与技术 “2013年度中国优秀开源项目征集”活动最后三天 为什么开发者倾向于使用杂乱无章的免费工具 EMC合作伙伴销售经理杜术清:实现云的三种途径 开发者想走向海外:你融入老外的圈子了吗? 前微软工程师:美国监控和直接访问服务器?这不太可能 代码、TDD速查表 如何选择前端架构:服务器端HTML vs. JS部件 vs.单页Web应用 世界上最高深的Android特洛伊病毒 招聘iOS开发,老板必问的5个问题 护航科技吴伟湘:IT离线安全体检服务将带来颠覆 百度王继平:移动互联网时代云平台思路 “第八届开源中国开源世界高峰论坛”火热开启 微软发布SQL Server 2014预览版,展示内存数据库技术 帮助软件开发者提高效率的10个小窍门 我想做个程序员:Technovation Challenge圆女孩编程梦想 未来我们开发的Google Glass应用将会是什么样? 独家:前RIM大中华区总经理刘征宇,加入Appconomy 用一个API搞定一切 Segment.io为移动开发者提供便利的分析数据分发服务 TIOBE 6月编程语言排行榜:JavaScript回归前十 如何用java程序来拨号 引用和指针 我想编个东西不知怎么入手,前辈指点!!!!!:) 报考程序员要具备哪些条件? 如何在服务器上创建目录???? 高手们请进来帮个忙吧!分数不够可以再加. 在DW中如何编辑文章的行距?用CSS吗? 对日期的处理问题 cout的问题(20分). 关于vector<string>的问题(40分). 有没有上海双杨的PB高手? 在pb中怎样写自动递加的序列号?? 我的visio 2000一旦启动以后,就会说遇到问题需要关闭 请问一个关于连接SQL SERVER2000的问题 两行数据重名,查询的时候只能显示其中一个,怎么处理? 在vbscript中的"%TEMPLATEDIR%\wvline.gif"的"%..%"是什么意思? 一个非常棘手的问题,求求各位了!是关于字符转换的!求求各位大侠! 找人 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 关于Dll里导出VCL控件的问题。。。高手请进。。。。。。 紧急求救!!! 如何制作浮动面板? 给分的问题! 如何获得 mod_webapp.so 紧急求救 想知道各位WINDOWS下用什么SNIFFER? 对于网络上的第三方控件的看法 简单问题?JTable中的数据如何居中对齐,有没有直接的函数(不用自定义CellRenderer) 有关析构函数 请问一个小问题 关于ADO中ltBatchOptimisticr的FilterGroup的问题 两个星要到多少分才能升到三个星呀 请问有谁知道北京的成人教育大致的情况如何? 是VC编译器不符合ANSI C++,还是?? 我现在在写个程序!是关于证券方面的!可是如下的一个小问题如何解决?? ★★如何让excel的某行的值等于另一行的值乘以一个固定值(急问,在线等待)★★ @@@开学了,散分! 怎样构建一个LDAP服务器和怎样使用 用VFW采集时进行压缩的问题。求解 C# 在DW MX中如何进行层定位? 回复:機會不要錯過! 華強科技有限公司幫你成就軟件工程師的夢想! How to access SMB/CIFS from Sun workstation? 谁来拿分啊。我有一个问题自己解决了,但没有给分的对象。 问一个message Bean的问题,up有分 [EJB]HelloWorldBean正确编译配置和执行,但"HelloWorld"却不见了 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 如何让主界面变成三维的那种 寻C语言编程高手!现有一IP地址和网页、搜索栏关键词拦截程序需要编写,付酬!!! 用什么组件能得到网站上的末知大小的文件? 问一个简单的问题 春季有什么蔬菜? 用一根长2米的木料,锯成同样的四根,用来做凳腿,这个凳子的高太约是多少? 甲、乙二人在一条东西方向的公路上行走,甲在乙西300米,如果甲向东走,乙向西走,2分钟后两人相遇;甲、乙二人在一条东西方向的公路上行走,甲在乙西300米,如果甲向东走,乙向西走,2分 请问24k金是什么金, 春季生长的蔬菜有哪些 两米长木料,锯成同样长的4根做凳子腿,高大约是多少 《奇妙的克隆》第一段和第二段调一下顺序好吗?为什么? 农村春天种什么蔬菜 岩棉夹芯系列彩钢板房一平方米造价大约是多少? 我今日看到一张写着"含24k金卡",我看上去外表像金,但很轻,经理说这不是纯金.但我怎么也想不明白,"含24k"是什么意思. i表示虚数单位,则(1+i/1-i)∧2012= 造一个宽4.5米,长11.5米,高3米的彩钢板房造价大约是多少?中间2道隔墙. 1.说说《奇妙的克隆》一文的结构与语言特点?2.你对《奇妙的克隆》一文,是否感兴趣,为什么?3.你能列举出目前“克隆”技术有几种?4.用诠释法说明“克隆”一词.(20字以内) 用一根长2米的木料,锯成同样长的四根,用来做凳腿,这个凳子的高大约是多少?(请列算式) 在一条长1000米路的两旁做临时过渡房,每间房子宽5米.每间房子要用80平方米的彩钢板.这条路临时住房一共需要多少平方米彩钢板? 奇妙的克隆第二段的内容,还有分为几段. 用一根长2米的木料,锯成同样长的4根做凳子腿.这个凳子的高大约是多少?这道算式怎么列 有这种挖土方体积算量的计算公式吗?三分之一的高度*(上口边长的二次方+下底边长的二次方+上口长*下口长)这是什么公式啊,这是书上例题里给的答案,算的是一个柱基基础挖土方的量.不是应 一辆汽车从甲地开往乙地,如果每小时比原计划多行10千米,可以比原计划提前2小时到达;如果每小时比原计划少行2千米,就会比原计划迟半小时到达.甲、乙两地相距多少千米? 用一根长2米的木料锯成同样长的四根,用来做凳腿,这个凳子的高大约多少,算式是什么? 一根木料长36分米,木工用30分钟锯了6段,平均每锯一次用几分钟?如果把它锯10段需多少分钟 月球车玉兔说可能熬不过这个月夜了, 把一个圆形剪拼成一个近似长方形,这个长方形的宽等于圆的半径,面积不变.已知这个长方形周长是16.56厘米剪开的圆形有多大?怎样算的一定要写清楚,算式一步也不能落下. 彩钢板盖顶阳光房有哪些优点 小亮测得一个圆形木桩的周长是12.56厘米,他的面积是多少? 挖土工程量怎么计算?一设备的混凝土基础,底面积为5m*5m,工作面为0.3m,挖土深1.5m,放坡系数1:0.5,则招标清单挖土工程量为多少立方米? 挖一个容积是1884立方米的圆柱形水池,底面半径10米,这个水池深多少米?如果在水池的地面和四周抹上水泥,抹水泥的面积是多少平方米? 等腰三角形ABC,AC=BC=10,AB=12,以BC为直径作圆O交AB于点D,求CG的长等腰三角形ABC,AC=BC=10,AB=12,以BC为直径作圆O交AB于点D,交AC于点G,DF垂直AC,交AC的延长线与点E.求CG的长.http://b4.ac-images.cdnmyspace.cn/cnimages 【案例6-3】试计算人工挖土工程量.已知某混凝土独立基础长度为2.1m,宽度为1.5m,设计室外标高为-0.3m,垫层底部标高为-1.9m,工作面c=300㎜,坑内土质为Ⅲ类土. 用一根长2米的木料,锯成同样长的四根做凳子腿,这个凳子的高是多少? 如图,等腰三角形ABC中,AC=BC以BC为直径作圆O交AB于点D,交AC于点G,直线DF⊥AC,垂足为F,交CB的延长线于点E求证EF是圆O的切线. 混凝土基础挖土工程量怎么算呀混凝土基础,地面积5*5,工作面0.3,挖土深1.5 放坡系数1:0.5,则挖土工程量 用一根长2米的木料锯成同样长的4根做凳子腿,这个凳子的高大约是多少 已知李老师架势轿车形式千米比骑摩托车少3.2分钟,他骑摩托车,每时行驶15千米,李老师驾驶轿车每时行几千米? 怎么算挖土后的清槽工程量啊? 用一根长2米的木料,锯成同样长的4根做凳子腿.这个凳子的高大约是多少? 明明的父亲每月收入3280元,母亲每月收入2520元全家每月生活支出是储存钱数的3倍,明明家每月储存多少钱?用比例解, 用一根长2米的木料,锯成同样长的4根做凳孓腿.这个凳子的高大约是多少? 用一根长2米的木料,锯成同样长的4根做凳子腿.这个凳子的高是多少? "24K金"是一个什么概念?如何理解这个"24K金"呢?举例:北京第一高楼国贸大厦建成开业 能防飞机撞击24K金贴墙面 两米的木料,锯成同样长的四根,用来做凳腿,这个凳子的高大约是多少?请问:凳面的厚度要算进去吗? 一张纸,一毫米厚,连对折10次,对折后的多厚?要过成和结果.急,很急,非常急,超急! 等腰三角形ABC的腰AB=AC=4厘米,若以A为圆心,2厘米为半径的圆与BC相切,则角BAC的度数为( )A 30° B 60° C 90° D 120°要过程的 ·生长过程中发生变化的动物 有一张厚度是0.2毫米的纸,如果将它连续对折10次,那它会有多厚?急,具体方式 在等腰三角形ABC中,AB=AC=2CM,若以A为圆心,1cm为半径的圆与BC相切,求角ABC的度数.RT.请说明理由. 城市道路挖土方一般属于“一般挖土方”,为什么? 一张1毫米厚的纸,对折1000次,厚度有多高?…… 在等腰三角形ABC中,AB=AC=4cm以A为圆心,2cm为半径作圆A,若圆A与BC相切,角BAC=___当___ 动物的生长过程 厚7.5cm彩钢板建造200㎡大约多少钱 王芳和刘强拿出同样多的钱合买一批录音磁带,王芳拿走了12盒,刘强拿走了8盒,回家后,王芳补给刘强13元钱.请问每盒录音带多少元? 修路时挖土的方量怎么算 房屋楼顶加层采用彩钢板房有哪些好处 一项工作,王兰单独完成需要八天,丽丽单独完成需要12天,一除以八分之一减十二分之一的差表示( ) 动物细胞的生长过程 我想做一个长20.9米,宽7.2米的房子的房顶用彩钢板做五脊四坡,怎么算面积啊.我想做一个长20.9米,宽7.2米的房子的房顶用彩钢板做五脊四坡,脊高是1米,怎么算面积啊. 把一个圆柱削成一个和它等底等高的圆锥,削去64立方厘米,圆锥的体积是多少?圆柱体积多少?算式 市政道路施工时,中桩坐标怎么算啊?市政道路施工时,坐标不知道如何计算,学什么书呢.有这方面的朋友会算的吗给支个招吧. 市政排水混凝土检查井,井顶标高是指井内顶标高,还是井结构外顶标高?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘