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

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

Android OpenGL下截图代码 查看Android应用的详细信息2.3有新方法 Android开发Java图书推荐 Android开发图书推荐 UiModeManager设置夜间模式和行车模式 Android 2.2新增的DeviceAdminInfo类 Android获取摄像头详细信息 Android流量统计TrafficStats类的使用 电子邮件解析android.net.MailTo类 扫描和获取OBB文件信息 Android加速感应器开发平衡球代码解析 StrictMode限制模式API加速你的应用 手势识别兼容Android 1.x和2.x的代码 NativeActivity类在NDK中管理Activity OBB文件和StorageManager类使用介绍 DownloadManager下载管理类2.3新增API介绍 Android平台上的11个感应器你都知道吗 Android 2.3中的java.io.File类新增功能 更轻松的获取APK文件安装时间 Android控件对应表,丰富你的UI设计 Android开发进阶之NIO非阻塞包(八) Android开发进阶之NIO非阻塞包(七) Android开发进阶之NIO非阻塞包(六) Android开发进阶之NIO非阻塞包(五) Android开发进阶之NIO非阻塞包(四) Android开发进阶之NIO非阻塞包(三) Android开发进阶之NIO非阻塞包(二) Android开发进阶之NIO非阻塞包(一) Android开发进阶教程系列(一)目录篇 Android开发调试工具TraceView多图演示 Android JNI实例代码(二) 我的SQL数据库的表不能打开。 GetModuleFileName的第一个参数如何获得? 如何知道用户浏览我的主页时逗留的时间? 三峡工程改变了中国东部的气候 请教!ROSE中如何画组织图 问个简单的问题,如何利用子程序改变公共变量数组的值 如何在主页将数据库中内容实现动态公告? 我要买JDBC for SQL Server7.0的jar驱动,谢谢! 求《c++大学教程(第二版)》下载 如何取一个页所有控件的ID值啊! 我的WSAD 5.0的新建“数据库Web页面”,为什么“下一步”和“完成”都不能按?(详情请进!)请帮帮我! 机器被入侵,help 非常简单关于TreeView Control。的问题。喜欢大家帮忙, 求助 一个说易也不易的问题 cookie 只能已天为单位 来过期么? :( 30分钟就国旗 用什么? 请教高手 有些IE不能瀏覽flash文件﹐請問在哪有下載? 求购时间控件,用去web开发 如何才能按照分类显示视图的内容呢? 同志们 再见 接分! 再发一次,ie版本问题怎么解决,100分 请教:在Rational rose中如何去设计数据库表? 为什么wndows2k pro一访问windows2k server就有"打印机"和"任务计划"的共享,可不可以消除? win2k server下,iis5.0有问题,我想卸载,再重新安装,怎么做? treeview的使用小结(一) INDY 资料! 请分析这段代码,谢谢 怎样获得DataGrid的DataSource? 有关struts的问题,返回页面结果不对!在线等待,以解决就结帖 怎么改变快捷菜单PopupMenu1的颜色? 用OWC组件做柱状图,需要显示不同颜色的柱状以及显示不同颜色的图例 VS.NET中如何让自定义的事件出现在属性编辑器中? javascript 中有没有能返回指定某年某月中总天数的函数 如何将主窗体中的变量传到报表中,以供dataset查询用,急急急!!! 新手探路 不知道这是不是一个bug 函数返回值类型问题 兄弟我现在改行搞传统的邮政商业信函业务!给点建议!来者有分! 装有isa客户端的机器不能用FlashGet或者蚂蚁下载 网路多少钱才要交税? Kingofark关于英语及外语学习的50个观点 adotable定位记录有哪些方法?如何使用? 超高难度求sql语句,非高手莫进,在线等.......... petshop有些代碼不明白。。。。。。。。。。。 哎,运算符重载把我卡住了!求救!!! 最后 请问函数传递,设置默认值问题! 通过ODBC连接INFORMIX的问题!急!急!急! 有没有VC高手想在上海找工作? 求一个发送邮件的例子(急!!) 关于山东省二胎政策:男方是国企正式员工,独生子女,农村户口,但是已将户籍转到单位集体户口;女方为农村户口,(姊妹两人),没有工作.双方现已有一女孩,为农村户口,请问这种情况能否 山东省生育二胎政策我是非农户口,老婆是农业户口,(年满三十一周岁),现生有一女,请问能否生育二胎? 现有世代连续的两管果蝇,甲管中全部是长翅(V),乙管中既有长翅(V)果蝇和残翅(v)果蝇,两管中的世代关系可 山东省二胎政策?我是山东省的,农业户口,妻子是非农业户口,我们现在有一个女儿,请问我还可以批二胎吗?如果不能有其他办法吗? 山东二胎政策请问生育二胎后必须结扎吗?有法律依据吗? 一个轻质弹簧上端固定,下端系一重物,重物沿竖直方向做上下振动(不计空气阻力)为什么机械能守恒,拉力不也做功了吗 uh-hun often do you eat vegetables and fruit 中文怎么写 For example,you should go for a walk after dinner ,( ) often and eat lots of fruit and vegetables.填空.来自:《英语周报》八年级下31期第二版Section B 第三题 (选出恰当词填空,有时需要变换形式)框内:read ,healt 天天酷跑闪电骑士和百变萝莉和音速小飞还有魔女娜娜哪个好?应该买哪个?我以前用的是猫小梦,打算等更新后买一个 天天酷跑星星的猫跟百变萝莉好不好 果蝇的翅形,体色和翅长(长翅或短翅)三对相对性状,长翅对残翅显性 国际刑事法院再次推迟肯尼亚总统出庭受评论:解决伊朗核问题需要信任和耐心美将俄歌星列入黑名单 俄抗议表示不可中国好声音华少演喜剧 不拼舌头拼演技日本万圣节:“僵尸”涌上街头占领东京空气污染致癌 波兰致力于减少碳排放美参院情报委拟法案缩减监听记录 被批原吉林省常务副省长田学仁受贿1919嘉兴消防严查7家液氨企业 清剿火患2在建工地内工棚突发大火 杭州滨江消防杭州疾控举行卫生应急联合演习 “全副两岸青年如何彼此融合 台湾嘉宾:要有马英九白内障手术顺利 回诊检查一切正闽台三岛县长同祭关帝 冀两岸风调雨顺新北市长朱立伦未来动向 国民党中央支台湾海基会前秘书长:谁来共同决定台湾台湾交通部门:盼两岸增航班事务免立法连胜文:选市长不能只靠一张嘴 不受民台湾已婚男老师与12岁女学生发暧昧短台中大甲妈祖由大陆返台 胡志强上香求山巡者如“张飞”一声吼 吓退不怀好意亲民党年底选战锁定成立议会党团 不推
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘