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

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

在Delphi中建立和使用别名 在DELPHI中使用ADO对象存取ODBC数据库 在Delphi中使用DBF数据 在Delphi中随意控制DBGrid 每一行的颜色 在Delphi中自动检测、建立数据库别名和表格 在存储过程中使用use database-Delphi资料 在一个Dbgrid中显示多数据库-Delphi资料 在运行期创建表-Delphi资料 怎样把可以使用的表名输出到一个选择框?-Delphi资料 怎样发布基于Microsoft SQL Server的程序-Delphi资料 怎样解决打开一个DBF表时的Index not found..错误-Delphi资料 怎样向SQL Server插入带有Image字段的记录-Delphi资料 怎样在Paradox表中加密码?-Delphi资料 自动Login数据库-Delphi资料 自动检测、建立数据库别名和表格-Delphi资料 自动注册Paradox-Delphi资料 Delphi 4增訂的Object Pascal Delphi 5 Enterprise版10大特点 Delphi 插件创建、调试与使用应用程序扩展 Delphi 程序制作要点 Delphi 中面向对象编程之我见 Delphi”程序级触发器”功能的实现 Delphi4.0系统提示信息的汉化 Delphi5优化 Delphi编程技巧十则 Delphi程序制作要点 Delphi的类型转换 Delphi第三方控件大测评 Delphi多层应用程序的实现 Delphi技巧点滴 Delphi使用经验五则 聊天请进(thinkingdog) 大家来谈谈 IBM都有些什么认证???什么认证现在比较吃香???谢谢!!! 打印数窗问题求助! 如何使用UrlDownloadtoFile下载文件使用进度条? 如何用在两次用getTime()中得到两个不同的时间。 一个类似于牛角尖的问题(多余的CONST),不能忽视,请各位高手详细说明!!谢谢! 怎样读写注册表,每次都不成功,气死我也~! 各位救命啊,用 TClientDataSet.Load XML 的问题。。。。 娃呀呀,pb8怎么这么难安装?jaguar组建就用了5分钟,regester window又用了10分钟,重启动后,还没完,偶不敢装了,把碟退了出来,大家是不是也这样?//牛虻 请教高手一个ado的问题. 请问一个TWebBrowser的问题 请问:系统崩溃后,找不到BOOT,系统告诉:DOS基本分区为格式化?无法引导启动! 在VB.NET的tabcontrol上放置AxMSFlexGrid控件问题,急 java3D 现在大家是用Oracle 8还是 Oracle 9??? C++问题求助! 请教一个错误的原因. 各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版 SCJP里的那些什么300-020,020是什么意思啊? 请问一个关于document.write()方法的问题。急啊! 初学者,欢迎灌水。 Delphi6的Bug?不兼容? 为什么我用GetProfileString()却总是得不到结果 sos 请教各位大侠一个问题 delphi6中的installShield 请介绍接收端CRC校验传输内容是否正确的方法,资料或代码。谢谢! 各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版? 谁会做软件狗?有钱赚了!!! 为什么我用QuickRep作的报表只能显示一条记录,而且columnHeaderBand上内容也显示不出来 请问在税务局开发数据库的同行么?? 大家好各位大侠请问Jeffrey Richter的windows核心程序设计是不是就是andvanced windows程序设计的第四版? 谁做过软件狗,马上来拿钱!!! 江苏省的成绩什么时候可以出来啊,我是徐州的 shockwaveflash没有hwnd,怎么办? chechy(chechy) 你在吗? 一个关于用excel做的日报的问题 谁会做软件狗,马上来拿钱!!! 给你下跪了,给你磕头了,给你鞠躬了。很简单的问题。谢谢 那位大哥能告诉我在VC中我要创建类的话应该做哪些工作步骤(要详细的,呵呵) 紧急求救,asp连接mysql问题 在使用twebbrowser的时候,怎样制止网页的自动刷新和跳转? vc编译器错了怎么办???突然死机,然后就不好好干了!!谢谢 ?如何将二进制的 值写如注册表? Delphi紧急求助! 我想问的是,返回的 ResultSet 中的某个字段(int 型),如何放到一个 int[]数组里去。因为 ResultSet 不知道怎样取 size,我又不想用 vector, ResultSet的getArray()方法也是莫名其妙。 c盘格式化后,怎样找到linux系统? 有意思 过来研究一下!!!!insert 的!!!!难道 25 不是 long integer 吗 我的程序debug版,一直调试好好的,我rebuid all 一下就出错了,错误如下:怎么回事? 位图问题? 怎样使用自定义的光标??? 我想找Hopen SDK的开发包。 把1.5长的竹竿直立在地面,测得竹竿的影子长是1.2米,同时量得一根旗杆的影子是这竹竿影子的6倍还多80厘米求旗杆的长. 肯德基的炸鸡配方全球只有俩人知道?那为什么全球各地的KFC的炸鸡基本是一个味?我没问它是不是垃圾食品,我只想知道,一方面,配方高度保密,另一方面,遍布全球的连锁店却出售同一口味的炸 想了解一下各种气候类型的特点,这不是快要地理生物会考了嘛.认真学习一下. 小明把2.5米的竹竿直立在地上,量得它的影子长度是1.5米.如果同一时间、同一地点量得一根电线的影子长度4.8米.这根电线杆高多少米?用比例解。 在空地上立一根竿子,让竿子被太阳照射,当一天中竿子的最短时,竿子的影子朝什么方向猪头滚从东.南.西.北和东南.西南.东北.西北中选 沼气池建好后,每天会产1万方的沼气提纯成5000方天然气压缩成20兆帕的一个成套设备需要投资多少钱啊?运行费用每立方需要多少成本?(沼气池是无动力运行的,每天自动产1万立方沼气) 为什么西西伯利亚平原多沼泽 一天中,阳光下直立物体影子长短有什么变化?爱你? 沼气提纯的技术设备大概需要多少的资金 根据规范的方法,超声波测砼裂缝的深度最小值是多少?为什么? 看云识天气写了几种云,分别对应什么天气 秋天的落叶宛如什么 混凝土的碳化深度怎么测定 请问以下几种云 是什么云 代表着什么样的天气状况隔着窗户拍的 效果不太好 有污点. 一天中,阳光下物体的影子随气温的升高而缩短,随气温的降低而增长.判断对错判断是对是错 当声波在混凝土内传播穿过裂缝时,在裂缝端点处产生衍射,其衍射角与裂缝深度具有一定的几何关系.BJCS-1型混凝土裂缝测深仪正是依据衍射角与裂缝深度的几何关系,自动计算实现裂缝深度的 表示天气的或云的成语有哪些 汽车牌号都有什么颜色的 车牌号靠前的都是领导的车吗 比如说鲁C00001 A、汶川大地震 B、我国东南地区的超强台风 C、西伯利亚地区大片沼泽的的形成 D、全球范围内的大气污染日益严重 请问上面四个选项中哪一个是由于人类活动对地表形态的破坏而造成的恶 求表示天气的或云的成语 汽车不同颜色的含义 一个太阳,竹竿,竹竿的影子是什么成语 天上云代表什么天气?云的形态各式各样,那每个形状都代表什么天气? 大众汽车后面的TSI字母不同颜色代表什么意思?意向车型:大众 迈腾有的是T是红色的 有的是SI是红色的 有的是I是红色的 垂直竖立在地面上的竹竿,阳光照射下竹竿影子一样长,太阳与地面夹角是多少度 混凝土裂缝怎么处理 压力容器的定期检查分为 阳光下,影子的位置和太阳的位置有什么关系?影子的变化和太阳位置的变化以及时间的变化又有什么关系? 混凝土裂缝的产生混凝土在下列情况下,均能导致其产生裂缝,试解释裂缝产生的原因,并指出主要防止措施.水泥水化热大;水泥安定性不良;大气温度变化较大;碱一骨料反应;混凝土碳化; 压力容器首检周期 kfc的菜单 法国的气候类型 比喻句 什么什么像是什么这道题是这样的:—————————————————,像是——————————————————.不能太简单了,不能像这样:月亮,像是香蕉.这样不给分的, 关于肯德基华莱士,这些仿肯德基的餐厅,点餐都是在菜单上点的,为什么肯德基这些规范的餐厅,点餐反而要在后面的玻璃上点,菜单上的只有套餐却没有单点的,比如一个汉堡包,而且肯德基的套 法国气候类型 秋天的落叶的比喻句有啥?一定要很形容的,很逼真的! 肯德基的全家桶.2014年的新春全家桶有什么(名字)、内容、价格和时间. 法国有什么气候类型?急 我国古代有很多测量时间的工具,你能列举几种仪器的名称吗?请重中选取一种,谈谈其中应用的原理. 西西伯利亚平原与东欧平原同是平原为什么气候差别如此大 法国的气候具有什么特点? 一道很麻烦的数学题,摆脱各位牛X人士,回答沙漏又称沙钟,是我国古代一种计量时间的仪器,它是题目如下沙漏又称沙钟,是我国古代一种计量时间的仪器,它是根据流沙从一个容器漏到另一个容 东欧平原和西西伯利亚平原的地理环境区别 秋天的落叶,散文开头,落叶的描写我只要一小段开头,很有意境的那种,不要敷衍, 气候分区的表示方法:2-1-4表示啥意思 东欧平原和西西伯利亚平原哪个大?还有为什么在世界地形图上看东欧平原和西西伯利亚都比亚马孙平原大?最好简洁一点! 谁能写《秋天的落叶》作文(纯属自写,不能和其他重复). 对秋天的落叶说点什么 中西伯利亚平原,西西伯利亚高原为什么要以西伯利亚命名 世界上最深的地震裂缝有多深?哪些地震裂缝超深? 古代人和现代人是如何测量时间的?测量时间的工具是如何发展变化的 为什么 肯德基配方 地震时造成大地出现裂缝然后那个裂缝是怎样补救的不过我还有一点不明白,就是沙的空隙会有很多'而地震时裂开的缝隙应该是土'然而给他灌沙他起不了很大的坚固性啊. 压力容器定期检验包括哪些内容? GB 10055-2007这个标准谁有啊? 我想知道肯德基的配方 什么是地震深度? 太阳光斜照地面,光线与水平面所成的角为b,长为l的竹竿与地面所成的角为a,当a为多少时,竹竿的影子最长 KFC的热橙汁的配料是什么?为什么我用雀巢的橙汁加方糖却调配不出kfc里的那种味道.橙汁粉放少了,觉得味道不浓,橙汁粉放多,又觉得味道很酸,加了糖或者方糖,又感觉太甜?到底kfc里是怎么配 地震时产生地面裂缝 裂缝下面是什么了?如题 为什么人掉下去之后会怎么样呢?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn