J2ME开发全程简述(二)开发周边(上)

十、增强J2ME的String能力——分割字符串
  从JDK1.4以后,String类中新增了split方法来实现字符串的分割,但是在J2ME中却没有该方法(MIDP2.0中也没有实现),但是在实际使用过程中,有些时候的确要用到这种操作,这里将我以前实现的一段代码和大家共享:
/**
* 分割字符串,原理:检测字符串中的分割字符串,然后取子串
* @param original 需要分割的字符串
* @paran regex 分割字符串
* @return 分割后生成的字符串数组
*/
private static String[] split(String original,String regex){

//取子串的起始位置
int startIndex = 0;

//将结果数据先放入Vector中
Vector v = new Vector();

//返回的结果字符串数组
String[] str = null;

//存储取子串时起始位置
int index = 0;

//获得匹配子串的位置
startIndex = original.indexOf(regex);
//System.out.println("0" + startIndex);
 
//如果起始字符串的位置小于字符串的长度,则证明没有取到字符串末尾。
//-1代表取到了末尾
while(startIndex < original.length() && startIndex != -1){
String temp = original.substring(index,startIndex);
System.out.println(" " + startIndex);

//取子串
v.addElement(temp);

//设置取子串的起始位置
index = startIndex + regex.length();

//获得匹配子串的位置
startIndex = original.indexOf(regex,startIndex + regex.length());
}

//取结束的子串
v.addElement(original.substring(index + 1 - regex.length()));

//将Vector对象转换成数组
str = new String[v.size()];
for(int i=0;i++){
str[i] = (String)v.elementAt(i);
}

//返回生成的数组
return str;
}

十一、J2ME在低级用户界面上分行显示文字
在J2ME的低级用户界面开发中,经常会遇到需要在Canvas上显示大量的文字,例如关于界面、游戏说明、游戏公告等信息。如果在设计时,将文字的内容和长度都固定,既不利于修改也不利于维护。下面介绍一个简单的方法,实现一个简单、可维护性强的方式。

  实现方法:
  1、将需要显示的所有信息做成一个字符串。
  2、编写一个将该字符串按照要求转换为字符串数组的方法。
  3、将转换后的数组以循环的方式显示在Canvas上。

  通过这样三个步骤,则修改显示的信息时,只需要修改包含显示信息的字符串即可,自己书写的方法可以按照以前的标准重新分割新的字符串。如果需要修改每行显示的字符个数,则只需要修改自己书写的方法即可。
  通过这样一种实现方式,可以很方便的实现显示一些比较长的文本信息,即使是可变长度的字符串也没有问题。

十二、J2ME中使用记录存储系统(RMS)存储信息
在MIDP中,没有文件的概念,所以永久存储一般只能依靠记录存储系统实现,关于记录存储系统的简介,可以参看教程:http://www-900.ibm.com/developerWorks/cn/java/j-wi-rms/index.shtml

  下面是一些记录存储系统的常用编码介绍:
  1、打开记录集:
  打开记录集使用RecordStore里面的静态方法openRecordStore,示例代码如下:
  RecordStore rs = RecordStore.openRecordStore(“username”,true);
  这样就打开了一个名称为rs的记录集,其中username为记录集的名称,该名称可以根据需要来取,第二个参数代表是否则没有时创建新的记录集,true代表在该记录集不存在时,创建新的记录集,false代表不创建。
  如果在打开记录集时,该记录集不存在,则抛出RecordStoreNotFoundException异常,所以检测记录集是否已创建可以使用该异常。
  注意:记录集打开以后记得关闭。

  2、向记录集中写入数据

  2.1增加数据
  向已经打开的记录集中添加数据,需要使用addRecord方法,示例代码:
  byte[] bytes = {1,2,3};
  int id = rs. addRecord(bytes,0,bytes.length);

  该代码将字节数组bytes的全部内容写入到记录集中,该方法的返回值为该信息的id,注意:id从1开始,而不是从0开始。
  你可以循环使用该方法向记录集中写入多条数据。

  2.2修改数据
  修改已经存在的记录集中指定id的数据,需要使用setRecord方法,示例代码:
  byte[] bytes = {1,2,3};
  rs. setRecord(1,bytes,0,bytes.length);

  以上代码的作用是将字节数组bytes的全部内容写入到id为1的记录集rs中。
  该操作会覆盖已有的数据。
  说明:有些时候,你需要将信息写入到记录集中的第一条记录中,则可以结合以上两个方法,则第一次时向记录集增加数据,以后来进行修改。

  3、从记录集中读出数据
  从记录集中读取已有数据,需要使用getRecord方法,示例代码:
  byte[] bytes = rs. getRecord(1);

  该代码从记录集rs中读取第一条数据,将读取到的数据放在bytes数组中。
  在读取数据时,可以获得记录集中id的个数,可以使用getNumRecords方法获得
  综合代码为:
  int number = rs. getNumRecords();
  int id = 1;
  if(id >0 && id < number){
  byte[] bytes = rs. getRecord(1);
  }

  4、从记录集中删除记录
  从记录集中删除记录的方法有两种:逻辑删除和物理删除。逻辑删除是指给删除的记录打标记。物理删除是指从物理上删除该记录,但是该记录的id不能被重用,也就是说该id不会被继续使用。例如一个记录集中有5个记录,假设你删除了id为3的数据,则剩余记录的id依然为1、2、4、5。这给便历带来了一定的麻烦。

  5、便历记录集
  便历记录集,即访问记录集中的所有数据,有两个方法,详见:http://gceclub.sun.com.cn/NASApp/sme/controller/teclist?tid=0103

  6、其他操作
  6.1删除记录集
  删除记录集不同于删除记录,需要使用deleteRecordStore方法,示例代码:
  RecordStore. deleteRecordStore(“username”);

  该代码删除名称为username的记录集。

十三、J2ME加密数据的一个第三方开源免费类库介绍
在J2ME编程中,经常遇到一些数据在存储或者传输时需要加密,下面介绍一个第三方的加密类库的一些资料:
  加密类库的官方主页:http://www.bouncycastle.org/
  
    介绍的文章:
  中文:https://18900.motorola.com/ewa_portal/develope/jc_j2messl_5_1.jsp
  英文:http://www.javaworld.com/javaworld/jw-12-2002/jw-1220-wireless.html
  该文章的源代码包含使用的一些方法。
  备注:因为该类库提供的功能比较强大,所以类库的尺寸比较大,最后在发布时需要将类库中不需要的类删除

十四、如何播放声音
在J2ME中,处理声音需要使用到Mobile Media API(MMAPI),该包是MIDP1.0的可选包,在MIDP2.0中已经包含了这个包。所以如果你使用MIDP1.0的话,请确认你的运行环境是否支持。
  
    一般手机支持的声音文件格式为wav、mid和mpg等。具体请查阅你的手机说明文档。在声音处理中,有很多处理的方式,这里说一下最常用的情况,播放JAR文件中的wav文件。
  播放声音文件的流程:
  1、按照一定的格式读取声音文件。
  播放JAR文件中的声音文件一般是将声音文件处理成流的形式。示例代码:
  InputStream is = this.getClass().getResourceAsStream("/Autorun.wav");
  其中Autorun.wav文件位于JAR文件的根目录下,如果位于别的目录,需要加上目录名称,如/res /Autorun.wav。

  2、将读取到的内容传递给播放器。
  将流信息传递给播放器,播放器按照一定的格式来进行解码操作,示例代码:
  Player player = Manager.createPlayer(is,"audio/x-wav");
  其中第一个参数为流对象,第二个参数为声音文件的格式。

  3、播放声音。
  使用Player对象的start方法,可以将声音播放出来,示例代码:
  player.start();

  在播放声音时也可以设定声音播放的次数,可以使用Player类中的setLoopCount方法来实现,具体可查阅API文档。
  下面是在NOKIA S60模拟器中测试通过。代码如下:
  
    package sound;
  import javax.microedition.midlet.*;
  import javax.microedition.lcdui.*;
  import javax.microedition.media.*;
  import java.io.*;

  public class SoundMIDlet extends MIDlet {
  private Player player = null;
  public SoundMIDlet() {
  try{
   InputStream is = this.getClass().getResourceAsStream("/Autorun.wav");
   player = Manager.createPlayer(is,"audio/x-wav");
  }catch(IOException e){
      System.out.println("1:" + e);}catch(MediaException e){
    System.out.println("2:" + e);}catch(Exception e){
    System.out.println("3:" + e);}
   }

    public void startApp() {
   if(player != null){
   try{
    player.start();
   }catch(MediaException e){System.out.println("4:" + e);}
   }
   }

  public void pauseApp() {}
  public void destroyApp(boolean unconditional) {}
   }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值