摘要:本文利用J2ME技术开发了一个文本阅读器,实现了手机对文本文件的显示,给出了该程序的实现代码,并对其关键技术进行了详细阐述。
关键字: J2ME 文本阅读器 Java 手机
0引言
随着通讯技术的发展及手机的普及 ,人们正在不断地给手机增加新的功能 ,其中 ,使手机实现一般只有 PC机才具有的功能——下载各种程序并运行 ,是目前手机发展的一个重要方向。为此 ,人们提出了各种各样的解决方案 ,其中基于 JAVA的 J2 ME方案无疑是最引人注目的。
本文通过J2ME开发一个文本阅读器,该程序可下载到手机上,随时随地的进行阅读,这样就可以通过这种方式开发一些学习软件,使手机用户可有一个随身学习的工具书。由于J2ME不可以对手机中的文件进行读写,所以在开发本程序时,只能在程序打包时把文本文件作为资源文件加入到J2ME发布程序中。如果想读写手机上的文件,则要使用各手机商家提供的特定开发平台和专用的类来开发,下面就文本阅读器的关键技术进行说明。
1 J2ME文本阅读器中的文本格式
J2ME中文本文件的格式,为了便于程序的开发和在运行中的读写处理,对要处理的文本文件要进行一定格式的整理。本程序中的文本要求用纯文本即可,每章为一个独立的文件,每一章中均可为多段,在文本中加入的空格和各种符号都可在阅读时如实的显示出来。文件写好后将其存入相应项目文件夹下的res文件夹中,如本文中的阅读器的项目名为test,则可将文本文件存入test\res文件夹下。
本系统要阅读三章内容,所以制作了三个文本文件,分别命名为test1.txt、test2.txt、test3.txt,将三个文件存入test\res文件夹中,到此文本内容准备完成。
2读取文本文件的主要技术问题
在J2ME中如何读取文本文件的内容,在本系统中写了一个函数用来读取指定的文本文件,文本文件做为参数传给该函数,该函数的返回值为字符串类型,将文件的内容做为一个完整的字符串返回。在读取文件内容时用到的主要技术,使用InputStream类定义一个输入字节流对象in,使用 ByteArrayOutputStream类定义一个内存数组输出字节流对象s,通过输入对象的in.read()方法来读取一个字节,将读出的字节通过s.write( )方法加入到s中,再使用s.toString()方法将内存转为字符串返回。读取文本文件的函数定义如下:
private String myReadLine (String testFileName) {
//函数头定义了函数的参数为文件名组成的字符串,返回值为一个字符串。
InputStream in = this.getClass().getResourceAsStream(testFileName);
//由文件名参数来定义一个输入流对象变量in
ByteArrayOutputStream s;
s = new ByteArrayOutputStream(); //产生内存数组输出字节流对象变量S
try{
int ch=0;
ch=in.read(); //由输入流对象变量in的read方法以字节为单位来读取文件的内容,读取到文件尾时的值为-1。
while ( ch!= -1 ) {
//如果未读到文件尾把读取的内容写入S变量中,并读取下一字节内容
s.write( ch );
ch=in.read();
}
in.close(); //关闭输入流对象。
} catch (IOException ioe){
System.out.println(ioe.toString());
}
String str = s.toString(); //将S变量转为字符串
try{
s.close(); //关闭输出流对象
} catch (IOException ioe){
System.out.println(ioe.toString());
}
return str.trim(); //返回文件中的内容字符串
}
3 将文本文件内容显示出来的技术
通过Form类定义一个表单对象f,通过对象的f.append()的方法将读取文本文件返回的字符串内容加入到表单对象中,为了该表单内容在阅读完之后可以返回上一级显示界面,通过f.addCommand()方法在表单中加入一个按钮对象,并通过f.setCommandListener(this)方法注册CommandListener高级事件处理,这样当选择按钮时即可调用CommandListener 高级事件接口类中的commandAction()函数,在该函数中判断是哪个按钮被选中,通过该函数中的代码来决定处理流程。最后通过Display类的Display.setCurrent()方法将含有文件内容的表单显示在手机屏幕上。处理代码如下:
Form f=new Form("超级阅读"); //创建一个Form对象f
strContent=myReadLine ("/test1.txt"); //读取test1.txt文件中的内容返回字符串
f.append(strContent); //将文本文件的内容加入到f对象中
f.addCommand(exitCom); //将退出按钮选项加入到f对象中
f.setCommandListener(this); //注册高级事件处理
display.setCurrent(f); //将f对象显示到手机屏幕上
4 阅读器中的菜单设计技术
本阅读器菜单结构分两级,一级菜单显示各章的标题,通过选择某一标题选项进入该章进行内容阅读,在章内容界面中设置二级菜单选项,二级菜单中只有一个选项即是返回选项,选中该选项后,则回到上一级,可重新选择章标题,进入新一章内容进行阅读。一级菜单通过List类来建立,首先产生一个List类的对象l,通过l.append("第一章",null)方法在l对象中加入一条选项,用同样的方法可加入多条选项,只要将第一章改为第二章、第三章等,可产生一个有多选项的l对象,通过l.addCommand(exitCommand)方法在l对象中加入一个按钮,作为退出按钮选项,通过l.setCommandListener(this)注册高级事件处理机制,通过该高级事件的注册在操作过程中选中某一选项时,系统自动调用commandAction()函数,并将选中的选项做为参数传递给该函数,在函数中判断选中的是哪一个选项,进行不同的流程处理。最后通过Display类的Display.setCurrent(l)方法将第一级菜单界面显示在手机屏幕上。一级菜单界面的定义如下:
List l=new List("超级阅读--小说",Choice.IMPLICIT); //定义一个List对象l
l.addCommand(exitCommand); //在对象l中加入退出按钮
l.append("第一章",null); //加入第一章选项标题
l.append("第二章",null); //加入第二章选项标题
l.append("第三章",null); //加入第三章选项标题
l.setCommandListener(this); //注册高级事件处理机制
display.setCurrent(l); //将界面显示在手机屏幕上
在阅读器的菜单设计中,无论是选择了章标题选项,还是选择了一级菜单中的退出或者是阅读章内容界面中的退出选项,都将进入commandAction()函数中,在该函数中进行相应判断进入不同的处理流程代码。
主要程序代码如下:
public void commandAction(Command c,Displayable s)
{
if(c==exitCommand)
{//如果是一级菜单的退出按钮选项则退出本系统
notifyDestroyed();
}
else if (c==exitCom)
{//若是阅读章内容中的退出按钮选项则退出阅读内容界面返回一级菜单界面
startApp();
resumeRequest();
}
else
{//如果选择的不是任何一个退出按钮,则进行选择章标题的判断
String strContent;
List tmp=(List)s; //将参数s进行类型转换,转换为List类对象
switch(tmp.getSelectedIndex())
//判断选中的是哪一章标题则进行该章内容阅读界面
{ case 0:
//第一章选中打开test1.txt
Form f=new Form("超级阅读");
strContent=myReadLine ("/test1.txt");
f.append(strContent);
f.addCommand(exitCom);
f.setCommandListener(this);
display.setCurrent(f);
break;
case 1:
//第二章选中打开test2.txt方法同第一章(略)
case 2:
//第三章选中打开test3.txt,如果还有更多章可按此方法再增加
} // switch 多分支结构语句结束
} //if 选择结构结束
} // commandAction函数结束
5结束语
JAVA手机的出现也给软件行业提供了新的机遇 ,能否给 JAVA手机提供足够多的软件资源是关系到其能否推广的重要因素之一。本文开发的文本阅读器使得在手机上阅读文件成为可能,这在一定程度上拓展了手机的功能,具有一定的应用价值。
评论