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

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

获取和设置ListView的选择项 EditText中显示隐藏Android输入法窗口 自定义ListView行间的分割线 Android程序完全退出的三种方法 WebView使用技巧和介绍 EditText仅允许特定类型数据输入 自定义Android应用的访问权限 android.text.format文件大小和日期解析类 Android Rootkit相关揭秘 androidmanifest.xml高级属性解析 根据packageName构造Context SQLite操作,还是raw方法更简洁高效 Android开发基础YesNo对话框构造代码 Android代码性能优化技巧 Android开发注意点 Part One onSaveInstanceState和onRestoreInstanceState的用处 Android基础概念Context的作用 在Android的Notification中显示进度条 Android跨进程数据通讯-剪切板Clipboard ConditionVariable Android线程同步 Android软件开发方向指导 ArrayList LinkedList Set HashMap介绍 PermissionInfo Android权限枚举方法 Android上HTTP协议通讯状态获取 Android开发需要自己完善的类库总结 Android的ListView控件滚动时背景问题 GestureDetector手势识别类 - 进阶篇 MenuInflater Android菜单从xml创建方法 EditText输入提示你知道吗? Android布局Java代码构造法 Android全屏设置代码 我急!深夜提问!大家看一看 有谁告诉我Microsoft Visual InterDev 6.0如何使用其中的站点管理 如何在Word工具条上加一个按钮 请问系统和上网的速度有关系吗 急需foxpro for win版,哪有??? 请教一下,ado.net里如何返回表里的行数? 如何在HTML页面中使用 Acrobat 的 PDF 阅读器控件 关于一个遗传算法得问题!! 请问一个TSR问题! 关于跨数据库查询的问题 请问在ListBox中可不可以将每一行字符串设置成不同的颜色? vb6.0中如何将dbgrid里的内容添加到数据库里? 请问怎样才能将窗体上的最大化按钮设置成无用,而保留最小化按钮? 各位专家:请问win2000 PRO 下的config.msi目录中的好多以rbf为扩展名的文件是什么文件?有什么用?可以删除吗? ASP.NET中DATAGRILD的烦人处 新手问两个简单的问题??? 想知道如何才能看见前页纸油笔写过后留下的字迹?(散分) 为什么用odbc连接的paradox表不能编辑? 哪位大侠帮看一下代码(关于链表),为何出"invalid type argument of `->'"的错 一个非常非常想从事计算机软件开发的愿望 关于Hook的一个小问题 文档视图结构中无法显示编辑框,怎么办啊??用什么代替啊 十万火急! 通过网络,进行语音聊天的程序。 你了解人工受精吗? 有关“无纸化考试系统”bow api中的常量 关于addslashes的问题 有关“无纸化考试系统”的问题??thanks all,bow 如何删除windowsXP?紧急!!! 【数据结构】考试用的是类pascal还是c语言 我想往服务器中传文件。请问,需要组件吗? 如何写naked function的prolog 和 epilog? LoadIcon(NULL,IDR_QQ) 关于用c写聊天室 帮忙看看是不是session_start()惹的祸 请问谁知道那里有php源码下载的好站,贴几个出来看看 一妹妹姐姐程序员求职,找深圳的工作 初级问题:RichEdit控件的ScrollBy方法自动滚动 推荐一个毕业设计题目,不要太难,我学的流体,用VC来做一个什么东西,推荐一个,谢谢. 今天中午饭后练习时台球斯诺克单杠52分~~~ 二个问题,第二个问题比较难! Windows.Net 3607 简体中文版下载,要的话赶快,不然链接要被删除了. From left to right: Jini, Mini, and Umji 请问我应该如何把图片存储在数据库里啊(急啊) 成都的高程何时报名,在哪,电话,何时考?? 有关access与sql的比较。 百思不解,请指点迷津 看点什么好 在PB作安全管理时,要编历菜单,而我问的问题是... 发现触发器的问题 有个小问题.请高手们回复一下.谢谢 在Rt△ABC中,角C=90°,a:b等于3:4,c=20,则a=___,b=___? Rt三角形ABC中,角c=90度,AC=5,BC=12,圆O经过A,B,C三点,则圆O的半径为 一个三位数,十位上是0,个位与百位上的数字之和是9,如果把这个三位数的个位数字与百位数字对调,则得到的新三位数比原三位数大693,求原来的三位数 在Rt△ABC中,∠C=90°(1)已知a=6,c=10,求b;(2)已知c=25,b=15,求a 如何将一寸照片PS为宽130高160,宽高为1.3比1.6,且像素大小在30k一下我已在ps里将宽130高160设好了,但比例不知怎么设,上面显示文档大小的宽度为1.1厘米,高度为1.35厘米,如我将文档大小改为宽1.3 一个三位数,十位上是0,个位与百位上的数字之和是9,如果把这个三位数的个位数字与百位数字对调,则得 在Rt△ABC中,∠C=90°,∠A、∠B、∠C所对的边分别为a、b、c (1)已知a :b=3 :4,c=25求a和b;在Rt△ABC中,∠C=90°,∠A、∠B、∠C所对的边分别为a、b、c (1)已知a :b=3 :4,c=25,求a和b;(2)已知a :c=5 :13,b 在△ABc中,AB=17,Bc=16,Bc边上的中线AD=15,试证明△ABc是等腰三角形 一个三位数,十位上是0,个位上与百位上的数字之和是9,如果把这个三位数的个位与百位对调,则得到新的三位数比原来的三位数大693,求原来的三位数. 照片像素250*350是什么意思,指的是长和宽吗,各是多少呢? 已知:如图,在△ABC中,AB=13,BC=10,BC边上的中线AD=12.求证:△ABC是等腰三角形 一个三位数,十位数上是0.个位与百位上的数字之和是9.如果百位和各位对调之后两数相差693.求原来的三位有算式 怎样使照片的大小变成小于500KB?照片长边1000像素是什么意思? 在rt三角形abc中,角c是90度,ac是3,bc是4.以c为圆心,当半径是2.4时,r与ab有什么位置关系? 关于确定一次函数表达式的题.已知y与x成正比例,且x=3时,y=-6,则y与x的函数关系式是?若直线y=kx+1,经过点(3,2),则k=?已知一次函数y=kx-2,当x=2时,y=-6,则当x=-3时,y=?若一次函数y=kx-(2k+1)的图像与y轴交 1寸照片的长宽各是多少像素? 在RT三角形ABC中,角B =90',AB=6厘米,BC=8厘米.点P由A 出发沿AB,边向点B 以1厘米/S的速度移动,点Q由点B 出发沿BC 边向C 以2厘米/S的速度移动.如果点P,Q 分别从点A,B 同时出发,那么经过几秒后QP平行AB?有 确定一次函数表达式的两道简单题1.已知一次函数的图像过点(0,1)和点(2,-1)点M(m,二分之一)在图像上,则m的值是______.2.一次函数y=bx+2的图像经过点A(-1,1),则b=_____.写出方法教我 如图,在△ABC中,AD⊥BC于点D,AB=AC,过点B作射线BP分别交AD、AC于点E、F,与过点C且平行于AB的直线交于点P.试说明EB²=EF·EP Rt三角形ABC中,角C=90°,AC=3cm,BC=4cm,以C为圆心,r为半径的圆与AB有什么位置关系?1、r=2cm 2、r=2.4cm 3、r=3cm’ 有一个三位数,个位数字为百位数字的2倍,十位数字比百位数字大1,若将此数个位数字与百位数字顺序对调,所得的新数比原数的2倍少49,求原数. 已知AD是三角形ABC的中线,过点B作射线交AD,AC于点E,F,与过点C且平行于AB的直线交于点G,求证BE^2=EF*EG 宽度约为130像素,高度约为160像素,宽高比例为1.3:1.6左右,jpg格式,30kb 以下.急. 有一个三位数,个位数字为百位数字的2倍,十位数字比百位数字大1,若将此数个位于百位顺序对调(个位变百位)所得的新数比原数的2倍少49,求原数 直角三角形两直角边的长分别为5厘米和12厘米,则斜边上的中线长为多少 宽度约为130像素(110~160之间),高度约为160像素(130~200之间),宽高比例为1.3:1.6左右,近期正面免冠1寸 有一个三位数,个位数字为百位数字的2倍,十位数字比百位数字大1,若将此数个位与百位顺序对调 直角三角形斜边上的中线长为4,则该直角三角形两直角边的平方和等于 一元二次方程(x-1)(x-2)=0的两个根为x1,x2,且x1,x2,且x1>x2,则x1-2x= 直角三角形两直角边分别为5厘米,12厘米.其斜边上高为多少 已知直角三角形中的两条边长分别为3和4,则斜边上的中线长是多少? 再出三道这样的题 各位大神已知直角三角形中的两条边长分别为3和4,则斜边上的中线长是多少?再出三道这样的题各位大神 数学七年级第七章与三角形有关的角.CE是ABC的外角角ACD的平分线,且CE交BA的延长线于点E,证明角BAC大于数学七年级第七章与三角形有关的角。CE是ABC的外角角ACD的平分线,且CE交BA的延长线于点 一个直角三角形他的两条直角边分别是3分米和4分米,斜边是5分米,求他的斜边上高是多少?女儿的数学题 俩个三角=3个方块3个方块=4个圆一个三角+一个方块+2个圆=400那么三角是多少?方块 CF是三角形ABC的外角∠ACD的平分线,且CE交BA的延长线于点E,证明∠BAC>∠B.这道问题在初一下册数学书的第77页的第10题(人教版)注意结尾是∠BAC>∠B.而不是“=”. 一个等腰直角三角形斜边和斜边上高的和是21则斜边的长是多少 在三角形ABC中,AB=17,BC=16,BC边上的中线AD=15,三角形ABC是等腰三角形吗?为什么? CE是三角形ABC的外角角ACD的平分线,且CE交BA的延长线于点E,证明角BAC等于角B加2角 一个直角三角形3,4,5 斜边上高线分成2个直角三角形,这两个小三角形的内心连线长度 在Rt三角形ABC中,角C=90°,AB=5,B=4,则cosA=-------. 在RT三角形ABC中,角C=90度,AC=5,BC=12,以C为圆心,R为半径画圆,若圆C与边AB有两个公共点,则R的取值范围是 CE是三角形ABC的外角,角ACD的平分线,且CE交BA的延长线天点E,证明角BACD大于角B 15 25 56 1225哪个数既是三角数也是正方行数 已知三角形ABC中,AB=17.BC=16.BC边上的中线AD=15,试说明三角形ABC是等腰三角形 如图在三角形abc中,ab=17,bc=16,bc边上的中线ad为15,三角形abc是等腰三角形吗?为什么 直角三角形斜边上的高与中线分别为5和6 则它的面积是多少 在Rt三角形ABC中,角C=90度,BC=3,AC=4,以B为圆心,BC长为半径作圆B,问:点A,C及AB,AC的中点D,E与圆B有怎样的位置关系 在△ABC中,AB=17,BC=16,BC边上的中线AD=15,求ABC的形状 如果直角三角形斜边上的高,中线的长分别是4,5,那么直角三角形的面积是____ 等腰直角三角形ABC中∠C=90度,点D是BC上任意一点,连接AD,过点B作BE⊥AD,交射线AD于点E,连接CE求∠AEC数等腰直角三角形ABC中,∠C=90度,点D是BC上任意一点,连接AD,过点B作BE⊥AD,交射线AD于点E,连接CE, 已知a+b+c=3,a^2+b^2+c^2=3,求a^2010+b^2011+c^2012 在直角三角形中,直角边上的中线分别长为4和7,斜边上的高为6,求直角三角形的面积 在三角形ABC中,点D是BC的中点,作射线AD,在线段AD急其延长线上分别取点E.F,连接CE.BF,添加一个条件,使得三角形BDF~=三角形CDE,并加以证明.你添加的条件是 已知c为负整数,且a,b,c满足(a-1)^+|2b+2|=1+c,则(a+b)^2009+a^2010+b^2011+c^2012= 已知直角三角形斜边上的高及斜边上的中线分别为5和6,则此直角三角形的面积为多少 已知实数a使得三个一元二次方程,x2-X+a=0 x2-2x+a=0 x2-4x+a=0 至少有一个方程有解,求a的取值范围 如果2010分之A=2011分之B=2012分之C,则A:B:C= 在RT三角形ABC中,∠C=90° (1)已知c=25,b=15,求a (2)已知a=12,∠A=60°,求b,c 如图,在RT三角形ABC中,∠C=90°,AC=3,BC=4.动点O在边CA上移动,且圆O的半径为2当OC等于多少时,圆o与直线AB相切? 已知a=2011x+2010,b=2011x+2011,c=2011x+2012,求a2+b2+c2-ab-ac-bc的值a2,b2,c2,为a的平方,b的平方,c的平方.
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘