J2ME经验总结之IO读取

转载 2007年09月27日 09:22:00
 

只以InputStream为例,讲讲IO读取的性能问题。
一般的硬件设备,或者网络,访问的速度都有可能存在一定的瓶颈。此外,建立连接的时间往往被我们忽略了。
特别是在J2ME所运行的受限平台上,这个连接的时间往往是不可忽略的。所以我们应该尽量减少连接次数,尽量一次交换更多的数据。

先看看示范代码吧:
while ((ch = inputStream.read()) != -1) {

}
以上是标准代码,曾让我疑惑过:
使用while循环,一个一个读,会不会效率很低?
于是我拿了一个30K的文件,跟下面的方法对比了一下。
byte[] data = new byte[inputStream.available()];
inputStream.read(data);
结果这两个方法的速度不相上下。

后来看了CLDC的源代码才发现,InputStream的read(byte[] data)等批量读取的方法都是在read()方法上加循环实现的。
原来是自己把自己耍了一回……

不过,能用批量读取的时候还是应该尽量用;万一某些平台,某些继承于InputStream的扩展类,用更高效的方法重载了批量读取方法呢?

此外,还有一点很重要,很多情况是无法调用InputStream.available()函数的。特别是网络连接。这样才能叫“流”嘛。
这就需要使用缓冲来解决了,下面提供一个我写的方法,没什么大不了的,用起来感觉还不错,今天兴奋了就介绍一下。
 private static final int BUFFER_SIZE = 1024;

 public static byte[] read(InputStream is) throws Exception {
  byte[] ret = null;
  if (is.available() > 0) {
   ret = new byte[is.available()];
   is.read(ret);
  } else {
   int rd;
   Vector temp = new Vector();
   int size = 0;
   while (true) {
    byte[] buffer = new byte[BUFFER_SIZE];
    rd = is.read(buffer, 0, BUFFER_SIZE);
    if (rd == BUFFER_SIZE) {
     temp.addElement(buffer);
     size += BUFFER_SIZE;
    } else {
     if (rd > 0) {
      size += rd;
     }
     int tsize = temp.size();
     ret = new byte[size];
     for (int i = 0; i < tsize; i++) {
      byte[] t = (byte[]) temp.elementAt(i);
      System.arraycopy(t, 0, ret, i * BUFFER_SIZE,
        BUFFER_SIZE);
     }
     if (rd > 0) {
      System.arraycopy(buffer, 0, ret, tsize * BUFFER_SIZE,
        rd);
     }
     break;
    }
   }
  }
  return ret;
 }

这个方法使用了Vector,有些人可能觉得它影响效率。
其实不然,我测试过。
之所以使用这个有点变态的方法,是因为我向来比较抠,最讨厌遇到不能获取长度的Stream啦,定义多大的缓冲都怕不合适。
于是,就使用了这样一个爱死不死的方法。反正手机内存就那点,我也不去费心去选取buffer长度了,让它自己看着办。 

J2ME游戏按键处理方法简述

J2ME游戏按键处理方法简述 摘要:在游戏当中很多时候,要求按键有更多的响应方式,我们的问题就多起来了。  正文:1.ScanKey()方法这种方法使在keyPressed()、keyRelease(...
  • NetMicrobe
  • NetMicrobe
  • 2006年11月04日 15:37
  • 1931

j2me经验总结之事件处理

(源自:http://www.j2medev.com/Article/Class1/Class12/200802/5176.html)基于事件触发模型进行编程可以在有限程度内增加程序的灵活性以及可扩展...
  • njcit
  • njcit
  • 2010年09月15日 16:59
  • 276

J2ME经验总结之Base64

Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to rep...
  • wanglixin1999
  • wanglixin1999
  • 2010年05月27日 16:43
  • 328

J2ME经验总结之对象序列化

最近常被问到对象存储的一些问题。所以决定整理一下着方面经验。把Java对象转换为字节序列的过程称为对象的序列化。把字节序列恢复为Java对象的过程称为对象的反序列化。对象的序列化主要有两种用途:(1)...
  • QGJava
  • QGJava
  • 2010年07月15日 00:18
  • 504

J2ME技术入门之一——J2ME程序的开发过程

       在进行J2ME开发以前,必须首先了解J2ME程序的开发过程,只有熟悉了开发过程以后才可以了解如何进行J2ME程序的开发。由于运行环境以及针对平台的不同,J2ME的开发过程和J2SE的开发...
  • Mailbomb
  • Mailbomb
  • 2005年06月23日 18:49
  • 2764

J2ME中文教程之J2ME技术概述

随着移动通信的突飞猛进,移动开发这个新鲜的字眼慢慢成为开发者关注的热点。在网上进行的最近一份调查显示,有24.34%的受访者涉足嵌入式/移动设备应用开发,这个数字可能略高于实际的比例,但也足可说明嵌入...
  • lpy123456
  • lpy123456
  • 2007年01月16日 12:37
  • 659

j2me经验总结之URLEncoding 【转】

作者:hunhun1981出自:http://blog.csdn.net/hunhun1981/URLEncoding是用于解决链接字符串中包含中文字符的一种转换编码。各种编程环境下几乎带有它的库函数...
  • tanhgm
  • tanhgm
  • 2010年11月23日 18:20
  • 386

用Eclipse做J2Me开发的前期配置

 我也是一个初学者,从一个初学者的角度上讲,就是要尽可能的详细,因为这个东西稍微配置不对,或者是那里没有注意到,就会走不少的弯路,所以我在这里把配置讲得非常的详细,以图文的形式展示,以免你看了不知道所...
  • fenglibing
  • fenglibing
  • 2007年09月05日 23:01
  • 10300

Eclipse搭建J2ME开发环境

sun_java_wireless_toolkit-2_5_2-ml-windows.exe 下载地址:http://www.oracle.com/technetwork/java/download...
  • ituff
  • ituff
  • 2011年11月07日 21:48
  • 1854

J2ME及其移植

J2me及其移植   1. 简介 1.1 系统结构 Java ME 以往称作J2ME(Java Platform,Micro Edition),是为机顶盒、...
  • ydhua1988
  • ydhua1988
  • 2015年01月22日 09:22
  • 1212
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: J2ME经验总结之IO读取
举报原因:
原因补充:

(最多只允许输入30个字)