作者: 王志 刚
5 J2ME 简表
5. 1 J2M E 简表是 什么 ?
如 我们在 前面教 程中 提及的, 一个简 表定义 了受 支持设备 的类型 。例如 ,移 动信息设 备简表
(MI D P ) ,定义了蜂窝电 话的 类。它把 一些特 定于域 的类 加入 J2M E 配置中来定义对 类似设备 的使用 。已经 为 J2M E 定义了两个简 表: KJav a 和 M ID P 。它们都构建 在 CLD C 之上。 KJav a 和 M ID P 都和 C LD C 及小型设 备相关联 。
简表被构建在配 置的顶 部。由于 简表是 特定于 运行 应用程序 的设备 的大小 (内 存的数量 ),所 以,某 个
简表是与 某种特 定的配 置相 关联的。 在纲要简表上, 您可以 创建自己 的简表 ,这种 纲要 简表也称 为基础 表,它 对于 CD C 也是可用的。 然
而,在本 教程和 本节中 ,我 们将只重 点学习 建立在 CLD C 上的 MI D P 简表。
5. 2 简表 : MI D P
MID P 适合诸如蜂窝电 话和寻呼 机等移 动设备。 MID P 和 K Ja v a 一样,也是建 立在 CLD C 之上的,并 且提供一 个标准 的运行 时环 境,允许 在终端 用户设 备上 动态地部 署新的 应用程 序和 服务。
M ID P 是一个公共的 、为 移动设备 设计的 工业标 准简 表,它不 依赖某 个特定 的商 家。对于 移动应 用程序
开发来说 ,它是 一个完 整的 、受支持 的基础 。
M ID P 包含下列软件 包, 前面 3 个是核心 CLD C 软 件包,另 加 3 个特定于 MID P 的软件包。我们 将在 后面的教 程中讨 论每个 软件 包:
· ja v a. l an g
· ja v a. i o
· ja v a. u ti l
· ja v ax . mi c ro e di t io n. i o
· ja v ax . mi c ro e di t io n. lcd u i
· ja v ax . mi c ro e di t io n. mid l e t
· ja v ax . mi c ro e di t io n. rm s
6 . J2ME 开发 环 境
J2 M E 开发的工具很 多,这 里我们以 Su n 公司发布 的 WT K 为例说明 下载和安 装 J2M E 无线工具包 (J2 M E W ir e le s s T oo l k i t )
J 2M E 无线工具包提 供一 个完整的 开发环 境来编 写和 测试 MID P 应用程序。下载 包括工具 、文档 和仿真 环境,例 如,一 个与 Fort e fo r J a v a 集成的模块。
目前, J2M E 无线工具包 仅支持 Windo w s 9 8 第二版、 Wind o w s N T 4. 0 和 W i n d ow s 20 0 0 是可用的,不 支持 Wind o w s 9 5 。 J 2 M E 无 线工具包 的 Sola r i s 和 L i nu x 版本在本教程编写 的同 时正处于 筹划之 中。
在 W in d ow s 环境下安装 J2 M E 无线工具包请按 如下 步骤:
1 . 下载 J 2 M E 无线工具包。
2 . 运行 j 2 me _ wi r el e s s _to o lk i t - 1 _0 _ 1 - f cs . ex e 安装无线 工具包 。 当系统提示您提 供安装 目录时, 请确保 该安装 目录 的完全合 法的路 径中不 包含 任何空格 。这将 帮助您 在
今后使用 工具包 时避免 可能 出现的问 题。
第二 篇 J2ME 和 J 2SE 的差异
在第二篇 J2M E 基本介绍中 ,通过对 CLDC/MI D P 以及 J 2 M E 编程的比较, 我们实 际上 已经看到 了 J2M E 和标准
Jav a 编程的一些差异, 本章 我们会从 两个方 面 来着 重阐 述 J2M E 和 J 2 S E 编程的重大 差异。
如下是一 个标准 的 J2S E 的 命令行程 序的示 例,一 般来 说标准的 J2S E 编程中,需 要一个以 mai n 函数作为入 口的启动 点。
如下部分 是一个 标准的 J2M E 的程序的主 题部分 ,不同 于 J2S E , J 2 M E 的程序的启动以及执 行是一 个个的 单 元构成。 在下面 关于 J2M E 应用简表 的介绍 中,我 们会 重点介绍 MIDLE T 的写法和生命周期 。
从这两张 图来看 ,标准 的 J2M E 的程序开发,和 J2S E 的差异还是 很大的 。下面 ,我 们就从两 个开发 领域的
总体和具 体分门 别类的 AP I 类别来说 明,在 这两个 领域 编程的时 候的差 异。
1 . 总 体 AP I 差异
1. 1 C LD C A PI
1.1.1 介绍
迄今为止,我们知 道 CLD C 比较适合 J2 M E ,并且也已经建 立了我 们的开 发环 境。在这 一章中 ,我们 将 更深入地 探索 CLD C A P I 。 C LD C AP I 实际上只是 J2S E 的一个子 集,它 包括 java . lan g 、 j av a .i o 和 jav a .u t i l ,另加一个新软 件包 - - j a va x .m i cr o ed i t i o n 。我们将逐个 来研究 这些 软件包, 并突出 显示每 一 个包中的 重要的 类。
尽管每一个类都 在 J2S E 中,但是没 有必要 让每一 个类的 CLD C 实现都能实现 J2 S E 支持的所有方法 。 您可以检 查 CLD C AP I 文档以确认哪 些方法 是受支 持的 。
1.1.2 j ava.la ng
CLD C ja v a. l an g 软件包是 J2S E ja v a. l an g 软件包的一个 子集。 与 J2S E 相 比,它最 引人注 目的可 能便是冗 长的浮 点操作 了, 特别是浮 点 (Flo a t ) 和双 精度 (Dou b le ) 类。如果使 用浮点的 话,这 些冗余 将 涉及到所 有其它 的类。
相对于 J2 S E v 1. 3 A P I , CLD C AP I 中删去了几个 其它的类 。其中 包 括 Clas s Loa d e r 、 C o mp i le r 、 Inh e ri t ab l eT h re a dL o ca l 、 Num b e r 、 P a ck a g e 、 P r oc e s s 、 Run t im e Pe r mi s si o n 、 S e cur i ty M an a ge r 、 Str i ct M at h 、 T hr e ad G ro u p 、 Thre a dL o ca l 和 V o i d 。
我们描述了可从 下面几 页表中的 CLD C j a va . la n g 软件包中 获取的 主要的 类。 Jav a 开发人员对所 有这
些类的使 用都应 该是非 常熟 悉了。
除这些核心类之 外,您 还将看到 CLD C 支持的 Ru n nab l e 接口,正象 Exce p t i o n 、 E r ro r 和其它有关 的类一样 。
1.1.3 j ava.la ng 核心运行时类
j av a .l a n g 软件包的核心运行时 类有:
· Cl a s s - - 显示正在运行的 Jav a 应用程序中的类 和接口。
· Ob j ec t - - 与在 J2 S E 中相同, Objec t 是所有 J av a 对象的基本类。
· Ru n ti m e - - 为 J av a 应用程序 提供一 种与运 行时 环境( Jav a 应用程序在其 中运行) 进行 交 互的方 法。
· Sy s te m - - 提供一些 静态的帮 助方法 ,就像 为 J2S E 提供方法一样。
· Th r ea d - - 定义 Ja v a 程序的一个 执行线 程。
· Th r ow a bl e - - J a v a 语言中所 有错误 和异常 的超 级类。
1.1.4 j ava.la ng 核心数据类型类
j av a .l a n g 软件包中的核心数据 类型类 有:
· Bo o le a n - - 包装 b oo lea n 原始数据类型 。
· By t e — - 包装 b yt e 原始数据 类型。
· Ch a ra c te r - - 包装 c ha r 原始数据类型。
· In t eg e r - - 包装 i n t 原始数据类 型。
· Lo n g - - 包装 l o n g 原始数据 类型。
· Sh o r t - - 包装 s ho r t 原始数据类 型 。
1.1.5 j ava.la ng 帮助类
j av a .l a n g 软件包的帮助类有:
· Ma t h - - 包含执行基 本数学运 算的方 法。请 注意 ,所有执 行浮点 值运算 的方 法都被省 略了, 仅保留 了 关于 inte g er s 和 l o ng s 的方法: abs() 、 min ( ) 和 max ( ) 。
· St r in g - - 在 J a v a 中代表对 象 Stri n g ,就像在 J2S E 中一样。
· St r in g Bu f fe r - - 代表一个可 以修改 的串, 就像 在 J2S E 中一样。
1.1.6 j ava.i o 输入类
CLD C AP I 包含许多 J2S E 中共同使 用的输 入类。 特别 地, CLD C j av a .i o 软件包中包括下 面一些 类:
· By t eA r r a y In p ut S tr ea m - - 包含一个内部 缓冲器 ,它代表 可能从 输入流 中读 取的字节 。
· Da t aI n pu t - - 一个接口,从二 进制输 入流提 供字 节以供读 取并把 它们转 换成 原始 Jav a 数据类型。
Dat a In p ut S tr e a m 提供该接口的实现 。
· Da t aI n pu t St r ea m - - 允许应用 程序以 独立于 平台 的方式从 基层输 入流中 读取 原始 Jav a 数据类型。
· In p ut S tr e a m - - 一个 抽象类, 它是所 有代表 字节 输入流的 类的超 级类。
· In p u t S tr e am R ea d e r - - 读取字节并把 它们按 照指 定的字符 编码方 法转换 成字 符。
· Re a de r - - 一种读取 字符流的 抽象类 。
注意:其中一些 类可能 不包含 J2S E 姊妹版支持的 所有方法 ,就像 在 java . l a n g 软件包中一样。 尤其 是省略了 浮点和 双精度 方法 。
1.1.7 j ava.i o 输出类
C LD C A P I 包含了许多 J2S E 中的共同使用的输 出类 。特别是 , CLD C j av a .i o 软件包中 包括下 面一些 输 出类:
· By t eA rra y Ou t pu t St re a m - - 实现一个输出流 ,在 此输出流 中数据 被写入 字节 数组。
· Da t aO u tp u t - - 一种接口,提 供原始 Jav a 数据类型以供 写入二 进制输 出流 。 Data O ut p ut S tr e a m 提 供该接口 的实现 。
· Da t aO u tp u tS t re a m - - 一个输出流 ,允许 应用程 序以一种 便捷的 方式编 写原 始 Jav a 数据类型。
· Ou t pu t St r ea m - - 一个抽象类 ,它是 所有代 表字 节输出流 的类的 超级类 。
· Ou t pu t St r ea mRe a de r - - 给出字符,并按 指定的 字符编码 方法将 其转换 为字 节。
· Pr i nt S tr e a m - - 添加 一种便捷 的方法 来打印 数据 值的文本 表现形 式。
· Wr i te r - - 编写字符 流的一个 抽象类 。
其中一些类可能 不包含 J2S E 支持的所有方 法,比 如浮点和 双精度 方法。
1.1.8 j ava. ut i l 收集类
CL D C j av a .u t i l 软件包中包含 J2S E ja v a. u ti l 软件包中最常 用的类 。这些 类中 包括四个 收集类 (实际 是三个收 集类和 一个接 口) ,以及日 期/时 间和实 用程 序类。
C LD C 支持的 jav a .u t i l 收集类有:
· En u me r at i o n - - 一个 接口,通 过项目 集允许 对例 程进行重 复调用 。
· Ha s ht a bl e - - 实现 h ash t ab l e ,将键映射到 值。
· St a c k - - 代表了一个后进先出 (LIFO ) 的对象集合或堆栈 。
· Ve c to r - - 代表可以 调整大小 的对象 “ 数组 ” 或者 矢量 。
1.1.9 j ava. ut i l - - 其它的类
CLD C 支持的 jav a .u t i l 类 中其余部 分包括 日期和 时间 类,以及 Rando m 实用程序类。下表 中简要 列出了 这些类。
· Ca l en d a r - - 一个抽象类,使 用一套 整型字 段如 YE A R 、 MO N T H 、 D A Y 等来 获取和设 置日期 。
· Da t e - - 代表特定的 时间和日 期,精 确到毫 秒级 。
· Ra n do m - - 一个实用 程序类, 用来生 成 in t 或 lon g 的随机值流。
· Ti m eZ o n e - - 代表时区的偏移 量,也 用于校 正时 间。
1.1.10 j avax .m ic ro e d it i o n .io
迄今为止 ,我们 在 CLD C A P I 中看到的所有 的类都 是 J2S E AP I 的子类。 CLD C 还 包含一个 附加的 软件包 -
- j a va x .m i cr o ed i ti o n. i o 。
在这个包里唯一 被定义 的类就是 Connec t o r 类, 也称为工 厂类, 包含创 建 Conn e ct i o n 对象或输入、 输出流的 方法。
当动态识别一个 类的名 字时, Connec t io n 对象就被创建了 。类名 称的识 别基 于平台名 称和被 请求连 接
的协议。 描述目 标对象 的参 数串应该 满足 RF C 2 3 9 6 规 范所要求 的格式 。请使 用下 列格式:
{ sc h em e }: [ {t a rg e t} ] [ { par a ms } ]
{ sc h em e } 是一个协议的 名称,如 htt p 或 f t p 。 { t arg e t } 通常是一个网络地 址,但是 面向非 网络的 协 议则可能 把它当 作一个 相当 灵活的字 段来处 理。还 有一 些参数, 如 {par a ms } 被指定为一系 列形如 ";x=y" 的分配形 式(例 如, ;myPa r am= v al u e )。
1.1.11 j avax .m ic ro e d it i o n .io 帮助接口
除类属 连接工 厂类之 外, javax . mi c ro e di t io n . i o 软件包中还包 含下列 面向 连接的接 口:
· Co n ne c ti o n - - 定义了最基本 的连接 类型。 这个 接口也是 此软件 包中所 有其 它连接接 口的基 本类。
· Co n te n tC o nn e ct i o n - - 定义了一个可 以通过 内容 的流连接 。
· Da t ag r a m - - 定义了一个类属 数据报 接口。
· Da t ag r am C on n ec t io n - - 定义了类属数据 报连接 和它必须 支持的 性能。
· In p ut C on n ec t io n - - 定义了一 个类属 输入流 连接 和它必须 支持的 性能。
· Ou t pu t Co n ne c ti o n - - 定义了一个 类属输 出流连 接和它必 须支持 的性能 。
· St r ea m Co n ne c ti o n - - 定义了一个 类属流 连接和 它必须支 持的性 能。
· St r ea m Co n ne c ti o nN ot ifi e r - - 定义了一个流连 接的通告 程序必 须具有 的性 能 。
2. M I DP API
2. 1 介绍
移动信息设备简 表 (MI D P ) 适合类似于蜂窝 电话和 寻呼机这 样的设 备。 MIDP ,就象 KJav a 一样,同样 也建立在 CLD C 之上。 MI D 简表提供 一种标 准的运 行时 环境,允 许在终 端用户 设备 上动态地 配置新 的应用 程序和服 务。
在本章中,我们 将详细 地讨论 MI D 定义的七个软 件包。我 们还将 建立一 个 MID P 应用程序示例。
2. 2 U I 设计注意事项
M ID P 包括一个低级 的 U I A P I 和一个高级的 U I A P I 。低级的 AP I 允许您完全 访问一个 设备的 显示 屏,也允 许访问 原始键 和指 针事件。 然而, 使用低 级 AP I 时, 没有可用的用 户界 面控件。 应用程 序必须 精确地绘 制出按 钮和其 它所 有的控件 。
相反,高级 AP I 提供简单的用户 界面控 件但不 能直 接访问原 始的输 入事件 或显 示屏。由 于显示 屏的尺
寸和 MID P 设备输入方法的 差异,控 件显得 很抽象 。 MID P 的实现确定了绘 制控件 的方法, 也确定 了如何 管 理用户输 入。
让我们在后面的 章节里 更进一步 了解 MID P 的软件包和类。
2. 2 MI D P A P I
M ID P 包含四个核心 CLD C 软件包 (ja v a. l an g 、 j a v a.i o 、 j av a .u t i l 和 ja v a x .mi c ro e di t io n .i o ) ,另 加下面的 三个特 定于 MID P 的软件包 :
· ja v ax . mi c ro e di t io n. lcd u i
· ja v ax . mi c ro e di t io n. mid l e t
· ja v ax . mi c ro e di t io n. rm s
我们将在本章的 后面部 分详细介 绍特定 于 MID P 软 件包。除 了上面 新的软 件包 之外, MID P 还向核心
CLD C 软件包添加了 四个新 类,如下 所示。
· ja v a. u ti l .T i me r - - 用于为后 台线程 中将来 要执 行的任务 确定时 间。
· ja v a. u ti l .T i me r Ta s k - - 被 ja v a. u ti l .T i me r 类使用, 用来为 后台线 程中 稍后的执 行定义 任务。
· ja v ax . mi c ro e di t io n. io. H tt p Co n ne c ti o n - - 一 个接口, 为 HTT P 连接定义必要的方 法和常 量。
· ja v a. l an g .I l le g al St ate E xc e pt i o n - - 一个 R u n tim e Ex c ep t io n , 指出在不合法或不 合适的 时间已 经调用的 一个方 法。
2. 3 MI D le t 介绍
M ID l e t 是一个 J a v a 类 ,它扩展 了 java x .m i cr o e d iti o n. m id l et . MI D le t 抽象类。实现 startA p p( ) 、 pau s eA p p( ) 和 de s tr o yA p p ( ) 方法,这些 方法类 似于 J2S E 的 j av a .a p pl e t. A pp l e t 类中的 star t ( ) 、 sto p ( ) 和 d es t ro y ( ) 方法。
除了扩充 jav a x. m ic r o e dit i on . mi d le t .M I Dl e t 的 主 MID l e t 类之外,一个 MID P 应用程 序通常还包 括 其它一些 类,这 些类能 随它 们的资源 一起被 打包成 为 ja r 文件 - - 称之为 MID l e t 套件。一个 MIDle t 套 件中的不 同 MIDl e t 能共享 ja r 文件的资源, 尽管不 同套件中 的 MIDl e t s 不能 直接相互 作用。
在 本章开 头,我 们已 经看到 MIDLET 程序的基本样 子了,这 里我相 信说明 一下 一个 MIDLE T 应用的周期。 MID l e t 在应用程序生命周 期中有三 种可能 的存在 状态 - - 运行状态、暂停状 态、 销毁状态 。运行 状态, 正 如其名称 所暗示 的,意 味着 MI D le t 正在运行中。 这种 状态始于 startA p p 方法被调用时。 在暂停 状态 中, MIDle t 持有的所有资 源将被释 放,但 是它准 备着 再次被运 行。调 用 noti f y P aus e d 方法时, MIDl e t 处于暂停 状态。 在销毁 状态 中, MIDle t 已经永久地将 其自身关 闭,释 放所有 的资 源,等待 着废物 清理程 序 的处理。 它是通 过 noti f y D est r oy e d 方法来调用的。
在接下来的两页 中,我 们来看一 个简单 的 Hell o W o rl d MI D le t 。
2. 4 Hello Worl d M IDle t
这个 MIDle t 也会在 M ID P 设备的显示屏上显 示 "Hel l o W or l d! " 和 E x i t 按 钮,按下 该按钮 会终止 应用程序 。
H el l oW o rl d .j a v a 文件 以下面的 代码行 开始, 这些 代码行导 入稍后 会在 Hell o Wor l d 类中使用的类 :
i mp o r t ja v ax . mi c ro e d i tio n .m i dl e t. M ID l et ;
i mp o r t ja v ax . mi c ro e d i tio n .l c du i .C o mm a nd ;
i mp o r t ja v ax . mi c ro e d i tio n .l c du i .C o mm a nd L is t e n er ;
i mp o r t ja v ax . mi c ro e d i tio n .l c du i .D i sp l ay ; i mp o r t ja v ax . mi c ro e d i tio n .l c du i .D i sp l ay a bl e ; i mp o r t ja v ax . mi c ro e d i tio n .l c du i .F o rm ;
由于 H e ll o Wo r l d 类是 一个 MID P 应用程序,它扩 展了 MIDl e t 。它也实现 Comma n dL i st e ne r 接口来处
理事件:
p ub l i c cl a s s He l lo W o r l d e xt e nd s M I Dl e t i mp l e m ent s C o mm a nd L is t en e r
下面的方法是一 个缺省 构造程序 ,它创 建一个 新表 单,在上 面初始 化控件 ,然 后显示出 来:
pri v at e F o r m fo r m ;
pub l i c He l lo W or l d( ) {
/ / Cr e at e a ne w f o r m o n wh i c h t o di s pl a y o u r te x t fo r m = n e w F or m (" T e s t A p p" ) ;
/ / Ad d t h e t ex t "He l l o W or l d! " t o t h e f or m fo r m. a pp e nd ( "H e ll o W orl d !" ) ;
/ / Ad d a co m ma n d b u t to n la b el e d " Ex i t "
fo r m. a dd C om m an d (n e w Com m an d (" E xi t " , Co m ma n d . EXI T , 1 )) ;
/ / Re g is t e r th i s o b j ec t a s a c om m an d Li s te n e r
fo r m. s et C om m an d Li s t e ner ( th i s) ;
}
调用 s t ar t Ap p ( ) 方法 启动应用 程序与 小应用 程序 的启动方 法很象 。在 MIDl e 的一次执行 中它可 能会
被调用多 次。如 果 MIDl e t 暂停, pauseA p p( ) 将会被调用。要 重新启 动 MIDl e t ,需调用 startA p p( ) 。仅 须执行一 次的主 初始化 代码 应该放置 在构造 程序中 :
p ub l i c vo i d s ta r tA p p ( )
{
/ / Ge t a re f er e nc e t o th e d i sp l ay , a n d s h o w t h e f or m Di s pl a y d is p la y = Dis p la y .g e tD i sp l ay ( th i s ) ; di s pl a y. s et C ur r en t ( f o r m ) ;
}
p au s eA p p( ) 被调用使得 MI D le t 处于暂停状态 。在 此应用程 序中, 当进入 暂停 状态时, 我们没 执行任 何操作; 但是我 们仍然 需要 在 MID l e t 中实现 p a us e A p p 方法,因为它 是父 MIDl e t 类中的抽象方 法。
p ub l i c vo i d p au s eA p p ( ) { }
d es t ro y Ap p ( ) 被调用,破坏了 MIDle t 并使其处于 销毁状态 。在此 应用程 序中 ,我们通 过将引 用设为
null ,释放了对表单的 引用 。
p ub l i c vo i d d es t ro y A p p(b o ol e a n un c on d it i on a l )
{
fo r m = n u ll ;
}
c om m an d Ac t io n ( ) 方法 是事件处 理程序 ,被请 求实 现 Com m an d Li s te n e r 接口 。目前, 它破坏 了应用 程 序并通知 应用程 序管理 软件 MI D le t 已经完成。
p ub l i c vo i d c om m an d A c tio n (C o mm a n d c , Di s pl a y a bl e d )
{
/ / De s tr o y t hi s M I Dle t de s tr o yA p p( t ru e ) ;
/ / No t if y t h e a pp l ica t io n m a na g em e n t so f t w ar e th a t t hi s M I Dl e t
/ / ha s e n te r e d th e de s tr o ye d s t a te no t if y De s tr o ye d () ;
}
2. 5 MI D P 软 件包
除 标准 CLD C 软件包之外, MID P 还包含三个附 加的软件 包:
· ja v ax . mi c ro e di t io n. lcd u i - - 定义用来控制 U I 的类。这个 软件包 既包含 高级 U I 类(例如
Form 、 C om m an d 、 D at e Fi e l d 和 Te x tF i el d 等),又包 含低级 U I 类(允许用 低级 方式控制 UI )。
· ja v ax . mi c ro e di t ion . mid l e t - - 包含 M ID P 主类中的一个 , MIDle t 类,为 MID P 应用程序提供 访问 关于其运 行所在 环境信 息的 权限。
j av a x. m ic r oe d it i on . r m s - - 定义一个类的 集合, 这些类为 MIDle t 提供了永久存储并 随后重 新得到 数 据的机制 。
2 具 体 AP I 集 差 异
在本章的 第一部 分,通 过对 J2M E 的 c ld c 配置和 md l p 简表的介绍, 我们已 经了解 了很 多 J2ME 的编程和 J2SE 的 差异。在 这一部 分,我 们将 通过对具 体各种 类型的 API 功能编程 的不同 ,来比 较和 分析这两 种开发 模式的 差 异。
2. 1 In / Out
这里是标 准 J2ME 的 io 规范
初看到 J2ME 的版本,也 许你 会觉得很 意外, 因为比起 J2SE 的版本, IO 的功能要 弱化 很多。 下面这张 图是标 准 J2SE 的 I O 框架,如 果要查 询 J2SE 的具体的 I O 输入输出 的类别 ,可 以参考 Su n 的 java d o c api 文档。
2. 2 St r in g 操作
一般说来 , J2ME 和 J2 S E 的 s t rin g 操作差别不大,但 是正 如前面第 二章提 到过的 , JVM 和 KVM 的差异以及两个 平台的 API 不同,有 些时候 有些很细 微的差 异,虽 然两 个平台都有 String 和 S tr i n g b uf f e r 的类别,但是 str i n g 的 s p li t /r e pl a ce a l l 方法,在 J2ME 中是不支 持的 。
所以在编 制具体 应用的 时候 ,如果发 现有些 类别方 法不 工作,就 需要考 虑自己 构造 一个实现 。
如下是 J2SE 的 API 方法截图:
这里就是一个在 J 2ME 中分割 spli t 方法的实现 。
/**
* 分割字符串,原理:检测字符串中的分割字符串,然后取子 串
* @pa ra m ori g inal 需 要分割的字符 串
* @pa ra n re g e x 分割字符 串
* @re turn 分割后生成 的字符串数 组
*/
pr ivate static St ring [ ] split (String orig in a l,S tring r e ge x )
{
// 取子串的起始位置
int star t I nde x = 0;
// 将结果数据先放入 Vec tor 中
Vec tor v = ne w V ec tor ( );
// 返回的结果字符串数组
S tring [ ] str = null ;
// 存储取子串时起始位置
int index = 0;
// 获得匹配子串的位置
star t I nd e x = orig in a l.i nde x Of (r e g e x );
// S y stem.out.println( " 0 " + sta rt I nde x );
// 如果起始字符串的位置小于字符串的长度,则证明没有取到字符串末尾 。
//- 1 代表取到了末尾
while( star t I nde x < ori g i na l.l e ng th( ) & & sta rt I nde x ! = - 1)
{
S tring temp = ori g inal. subst ring (inde x ,star t I nde x ); S y stem.out.println(" " + sta rt I nde x );
// 取子串
v.a ddEle ment( temp) ;
// 设置取子串的起始位 置
index = star t I nde x + re g e x .len g th() ;
// 获得匹配子串的位置
star t I nd e x = orig in a l.i nde x Of (r e g e x ,star t I nde x + r e g e x .leng th( )) ;
}
// 取结束的子串
v.a ddEle ment( or i g in a l.s ubstring (inde x + 1 - re g e x .leng th() )) ;
// 将 Vec tor 对象转换成 数 组 str = ne w St rin g [ v.siz e () ] ; for (int i=0;i< v.siz e () ;i+ + )
{
str[ i ] = ( S tring )v.e lem e ntAt(i);
}
// 返回生成的数组
re turn str;
}
BlackBerry SDK下载
相关链接:
BlackBerry J2ME 编程指南(一)
BlackBerry J2ME 编程指南(二)
BlackBerry J2ME 编程指南(三)