分享

几个J2ME读书软件的比较与猜想

 brianzhao 2007-09-20


作者:马健
邮箱:stronghorse@tom.com
主页:http://stronghorse.yeah.net
初版发布时间:2005.08.01
当前版本发布时间:2005.08.08
当前版本:1.01

一、前言
二、打包运行软件
    1、eBook电子书制作程序
    2、JBookMaker(简称JBM)
    3、小D图书生成器
三、独立运行软件
    1、MicroReader
    2、ReadManiac
四、比较与猜想
    1、文本显示方式
    2、显示字体
    3、RecordStore支持
    4、压缩文件支持
    5、打包运行与独立运行
    6、制作过程
    7、JAR包操作
    8、理想的读书软件
    9、手机设置
附录 更新历史


一、前言

受鄙公司同事影响,前段时间我对用手机看小说比较热衷,因此对基于J2ME(俺穷,别说PDA,连支持Symbian OS和Smart Phone的手机都没有)的读书软件进行了一番调查、比较,以选定对我自己来说最合适的。这篇文章可以看作是对那段时间工作的一个总结。

由于我自己的手机是西门子SL55,我同事的手机是Nokia,因此我的调查以这两个品牌为主,肯定会存在“一叶障目”的问题,各位如果对其它品牌上的读书软件或这两个品牌上的其它读书软件比较了解,欢迎交流。

根据我自己的了解,我将J2ME读书软件大体分成两类:打包运行软件和独立运行软件,再对每一类中的不同软件进行比较。各位如果觉得这种分类法不合适,也欢迎交流。

在对软件进行比较、说明的时候,所有观点都只是我个人的观点,其中颇多猜测,因此文章标题才叫“比较与猜想”。既然是个人意见,当然允许争论。

软件一律以文中所列版本为准,不排除后来因为软件升级而使我的比较成为废话的可能。毕竟俺只是一个可怜的凡人,没有预测能力,所以只能到此为止。

二、打包运行软件

所谓打包运行软件,是指电子书内容(TXT文件)嵌入读书软件的JAR包中,成为JAR包的一部分。阅读前先将JAR包上传到手机,然后运行JAR包开始阅读,因此在国内某些相关文章中也称这种形式的电子书为“JAR书”。从目前搜索的情况来看,国内实际运用的JAR书制作软件以国内自主开发的为主。

1、eBook电子书制作程序

版本:v1.3.6
网站:http://j2me.

优点:

  • 该软件完全基于J2ME标准,没有采用任何品牌手机独有的API,因此通用性较好,差不多能在所有支持J2ME的手机、手持设备上运行,因此也成为搜索引擎能够找到的国内介绍文章最多的J2ME读书软件。
  • 该软件的JAR包没有进行任何混码处理,反编译后就能看到原始JAVA代码,因此是一个很好的J2ME编程范例。事实上在我读了它的源代码后,再看国内另外几个J2ME读书软件的代码,总觉得有点似曾相识的感觉——当然这也可能是我的错觉。

缺点:

  • JAR包本身比较大,因此在某些对JAR包尺寸有限制的机型(如某些Nokia机型最大JAR包64KB)上,可供存放实际内容(TXT文件)的空间相对较小。这个与它的JAR包没有混码有关,混码后JAR包尺寸会明显减小。
  • 制作软件是用Word VBA写的,感觉用起来比较麻烦,最夸张的是要求机器上先安装10多MB的JDK,对JAVA开发人员来说可能无所谓,但对一般用户来说就有点心烦了。

2、JBookMaker(简称JBM)

版本:1.06
网站:http://www.

刚开始的时候,这个软件的使用对我来说有点曲折,不过习惯就好:

  • 这个软件的打包程序(JBookMaker.exe)在Windows 2000 SP4下运行正常,在Windows XP SP2下一点“制作”就没有反应。但是我看了一下,其实该生成的JAR、JAD文件都已经生成好放在C:\TEMP\javabooktemp目录下,手工拷贝出来就可以上传到手机了。
  • 如果生成的电子书要在三星、Nokia、西门子手机上看,制作的时候务必要在打包程序中选上“三星Nokia西门子”选项,我刚开始的时候就是因为没选,所以做出来的书都看不了。当时为了搞清不能运行的原因,我把它的JAR包反编译了一下,虽然进行了混码处理,但在我看来似乎还是和eBook的源代码有某些血缘关系,因此没有进一步分析下去。

优点:

  • 与eBook相比,功能有所增强,包括选择字体、选择颜色等;但是在选项操作上,感觉不如后面要说的小D、MicroReader方便。
  • 和eBook一样,也支持多种品牌的手机。由于进行了混码处理,代码尺寸比eBook小,因此JAR包中可以存更多的内容。

缺点:

  • 虽然该软件的使用说明上说“JBM是一个只有一个EXE文件的绿色软件,无需安装便可使用”,但是按照一般理解,“无需安装”仅仅只是“绿色软件”的一个必要条件,而不是充分条件:该软件的制作软件JBookMaker.exe运行后,会在C:\TEMP目录下生成javabooktemp目录,在里面放入1.71 MB的jre内容,而在软件退出时并不会清除这些内容,即还是会留下垃圾文件,而在使用说明中对此没有进行任何说明,未免显得不够“绿色”。不过出于好奇,我把eBook电子书制作程序里JDK的路径(记录在注册表的HKEY_CURRENT_USER\Software\VB and VBA Program Settings\BookMaker\Options项下)改成C:\TEMP\javabooktemp\jre,居然完全能够运行。看来在运行过JBookMaker后,如果再想用eBook电子书制作程序,就不必再去下载、安装庞大的JDK了,也是一方便的事情。
  • 制作程序的选项被改变后,新的选项值将会记录到注册表中,这个严格说来也不符合绿色软件的要求。

3、小D图书生成器

版本:1.2
网站:http://www.

优点:

  • 这个是我见过最简洁的J2ME读书软件,不仅JAR包内容非常简单,功能也是够用就好。
  • 简装版JAR书制作软件本身自带了打包程序jar.exe,因此既没有必要下载、安装JDK,也不会在运行的时候跑到temp目录里写文件,真正绿色。出于好奇我看了一下,这个jar.exe并不是JDK所带的原版jar.exe,而是用Delphi写的,封装了Delphi提供的zip文件处理控件VCLZip、VCLUnZip(JAR包其实就是标准的ZIP文件,文件扩展名不同而已,所以用WinZip和WinRAR都能打开、添加、删除内容),运行的时候不需要其它DLL的支持。

缺点:

  • 调用了Nokia SDK,完成背景灯控制等功能,因此只能在Nokia机上运行。
  • 采用固定尺寸的彩色图片做封面,不仅图片要消耗空间,而且在6230这样的大屏机上,图片显得有点小,而在6310这样的小屏黑白机上,图片又显得有点怪异。

三、独立运行软件

所谓独立运行软件,是指读书软件完全以独立JAR包的形式存在,与需要阅读的内容(TXT、TCR等文件)完全分开。读书软件只需上传到手机一次,以后将要阅读的内容传到手机里,然后用读书软件打开即可阅读,类似于PC机上的读书软件。

独立运行的读书软件对手机有一个最基本的要求:手机必须提供文件操作功能。由于文件操作不在J2ME标准范围之内,各手机厂家对它的支持程度不一,提供的接口也不一样,因此这种软件多半都是针对某种品牌或某种型号的手机开发。目前西门子手机基本都支持文件操作,Nokia只有部分新型号支持。

从目前搜索的情况看,这种软件国外做的比较多。

1、MicroReader

版本:1.5.1C
网站:http://home./thvoslef/midlets

优点:

  • 虽然是外国人写的软件,但是有中国人参与,对中文支持极好,因此成为我首选的读书软件。
  • 支持TCR等压缩文本格式,能够有效利用手机上有限的存储空间。

缺点:

  • 启动速度实在太慢,对俺的耐心是一种考验。
  • 不支持外挂字体,看英文文章时一屏显示的内容略显不足。

2、ReadManiac

版本:2.3.0
网站:http://www./hax/ReadManiac.htm

优点:

  • 支持外挂字体,尤其是小字体,是看英文文章的首选。从我在网上搜索的情况看,支持外挂字体正在成为国外J2ME读书软件的潮流,大概是因为手机屏幕实在太小,用缺省字体看字母文字,一屏显示不了几个单词。
  • 同时提供独立运行和打包运行两个版本,方便选择。
  • 独立运行版本支持的压缩格式比MicroReader还多,连ZIP都支持了。
  • 打包运行版不仅提供简洁易用的打包导航界面,而且不需要安装JDK或其它附加软件。打包的时候如果选择Generic MIDP 1.0 phone,打出来的JAR包与具体手机无关,可以在所有支持J2ME的手机上运行。

缺点:

  • 从外挂字体的实现机理上来看,很难支持中文;而去掉了外挂字体功能,这个软件又没有太大意思,因此虽然提供打包运行版,但是我在前面的打包运行软件中没有提到它。
  • 启动速度也有点慢,毕竟强大的功能也是要付出代价的。

四、比较与猜想

1、文本显示方式

要想写一个读书软件,首先要解决的问题就是怎么把文本在屏幕上显示出来。对于J2ME软件来说,通常都是在Canvas派生类的paint方法里,调用Graphics的drawString或drawChars方法。但是这两个方法都不支持自动换行,因此需要由读书软件自己凑出刚好够一行显示的字符串,然后逐行显示。国内、国外软件在计算行长的时候采用的技术有所不同,比较一下也是一桩趣事:

  • 前面提到的三款国内出品的J2ME读书软件,都与当年的中文DOS持有相同的观点:中文字符的显示宽度是相同的,英文字符的宽度是中文的一半。因此调用Canvas对象的getWidth方法获得屏幕宽度以后,除以中文字符宽度(用Font对象的charWidth或stringWidth获得),即为一行能够显示的中文字符数。然后按照一行字符数抽取字符串,显示出来就刚好是一行。
  • 外国人可能是罗马字体看多了,因此在他们看来,字符的宽度是不会相同的。以MicroReader为例,就先计算出每一个字母字符(ASCII码小于256)的宽度,再计算中文字符(ASCII码大于等于256)宽度,显示的时候根据字符串内容计算实际宽度,再考虑英文换行规则(一个单词不能显示到两行上),决定每一行的内容。

在代码实现上,当然是中国人的方法简单快速,但是在显示效果上,我看还是外国人的笨办法好一点:

  • 那几款国内出品的读书软件看中文文章问题还不大,但是没有一个能看英文的:单词都被分隔乱了。eBook电子书制作程序做出来的JAR书,虽然提供英文界面,但我怀疑它在真正英文环境的手机上根本就跑不起来:它测量字符宽度时用的是中文字符,在没有安装中文字体的手机上测出来的字符宽度不知道会是什么样子。
  • 在中文手机上,即使中文字符宽度都相同,但中文标点的宽度也可能不同,至少在我用的西门子SL55手机上,中文标点的宽度绝对小于中文字符的宽度,因此显示中文的时候,如果一行上多有几个标点,这一行就会短一截,看起来总有点怪异。我想到的解决办法:采用比MicroReader更笨的方法,在显示字符串里每增加一个字符,都用stringWidth测量一下字符串的实际长度,以获得最佳显示效果。当然这样速度会慢一些。

2、显示字体

由于某些原因,用户通常都希望读书软件在显示时能够根据需要调整字体大小:

  • 对于希望在一屏里看到尽可能多内容的人来说,字体小一点好。尤其对于字母语言来说,考虑到一个单词不能分到两行上显示,因此对这方面的要求就更迫切一些。
  • 对于视力不好的人来说,字体当然是大一点好。

和文本显示方式一样,国内外的读书软件在解决字体大小时采用的方法也有所不同:

  • 对基于字母的语言来说,字母数毕竟是有限的,因此可以采用外挂字体的方式,在字体文件中给出每个字母的显示点阵,显示时按点阵显示即可。ReadManiac就提供一个字体文件生成器,可以定义不同大小的字体。
  • 对于中文来说,外挂字体的方案显然不现实,毕竟中文字实在太多。因此只能采用J2ME定义的SMALL、MEDIUM、LARGE三种大小。但不幸的是,在某些厂家看来,支持三种点阵的汉字成本还嫌太高,如在我的西门子SL55上,就只能使用MEDIUM字体,LARGE的中文字不全,SMALL干脆没有。而在我同事的Nokia 6310下,三种大小的中文字体都完全支持。

另外还有一点令我奇怪的是,专门针对Nokia机型的小D读书软件允许在运行时调整字体大小,但是在打包软件里却没有地方设置缺省字体大小,因此如果我喜欢用大字体,就只能在手机里打开每一本书后,都要先设置成大字体再看,实在有点不太方便。JBookMaker也有这个毛病。

3、RecordStore支持

读书软件在运行或退出的时候,往往需要留下一些记录,如当前阅读位置、当前字体大小、背景颜色等,这样在下次再进来的时候,就可以自动恢复到上次退出的地方,并且字体大小、背景颜色等也完全一样,方便接着看上次没看完的书。

按照J2ME标准,这种持续性的记录应通过RecordStore接口访问。而从我看到的情况看,我认为不同品牌的手机在实现RecordStore接口时,采用了不同的方法。

西门子手机大概是支持文件系统支持惯了,因此RecordStore也是通过文件系统提供支持:每个JAR包的RecordStore记录内容,以文件的形式保存在JAR文件所在目录的storage子目录下,因此

  • 为了避免冲突,最好将每个JAR包放在单独的目录下。
  • 删除手机软件的时候,将软件所在目录整个删除即可,非常方便,就算是用第三方管理软件也没有问题(西门子手机管理软件可能是我用过最难用的软件之一)。

而对于Nokia手机来说,文件系统的概念就没有这么强烈,所有JAR包的RecordStore记录内容都集中存放在一个地方,以jad文件名为索引,因此

  • 每个jar文件都要求有对应的jad文件,西门子手机则无此要求。
  • 往手机里上传、删除软件的时候,不能通过第三方软件,只能通过Nokia提供的专用管理软件(也不是什么好用的软件),否则可能无法保证RecordStore等存储结构的数据一致性。

再考虑到Nokia手机对JAR包尺寸的限制,而西门子即使是几百块钱的低端手机都对JAR包尺寸没有限制,俺总觉得西门子手机比Nokia手机更适合看书。

4、压缩文件支持

把文本文件压缩后再存储,要比存储原始的文本文件更省地方,这是基本常识。尤其对于手机环境来说,存储空间实在有限,想扩容不仅需要手机本身支持(俺的SL55就不支持…>_<…),还要花钱买扩展存储卡,因此对于压缩格式的支持程度,一直是我评价读书软件的一个重要指标。

不过在显示压缩文本前,需要先对文本进行解压,解压代码本身需要存储空间,解压过程又需要时间,这也是基本的常识。对于打包运行的读书软件来说,由于JAR包的最大尺寸往往是有限制的,因此解压代码的时间和空间消耗,可能会大于压缩带来的好处(JAR包大小=代码+内容),这大概就是为什么打包读书软件基本上都不支持压缩格式的原因。

而对独立运行的读书软件来说,JAR包内不需要包含书籍内容,因此有更多的空间容纳解压代码,自然就可以大张旗鼓地支持各种压缩格式。在ReadManiac的官方网站上,就提供了支持多种压缩格式的J2ME源代码。

5、打包运行与独立运行

前面说过,打包运行的读书软件国内比较多,而独立运行的软件国外比较多。造成这种局面的原因,我猜测和手机的流行品牌有关:独立运行的读书软件需要手机的J2ME API提供文件功能,目前西门子的大多数型号都提供,而Nokia只有部分新型号提供。西门子已经把在中国的手机业务脱手了,由此可知西门子手机在国内的流行程度,至于Nokia的几款新机,考虑到价格因素,也不是说换就换的。而据我在西门子工作的同学说,西门子手机在欧洲卖得很好,拥有一批忠实的用户。

在同时支持打包运行和独立运行的手机(如俺的SL55)上,面临的一个问题就是究竟该选用哪一类读书软件。按照我的计算,如果手机里只存一、两本书,用打包运行的读书软件可能更省地方,而如果一次要往手机里灌多本书,则绝对是独立运行的读书软件更省存储空间。如果再考虑电子书制作的难易程度,及读书软件的功能,则独立运行的读书软件无疑拥有压倒性的优势。

所以我现在用的是MicroReader 1.5.1C。

6、制作过程

手机电子书的制作过程是一个复杂的过程,包括素材收集、素材整理、打包等步骤,没有做过的兄弟可以google一篇名为《电子书制作一条龙》的文章,第一次看到的时候俺也被吓了一跳。

素材收集部分还好说,基本上就是运用各种下载工具去找需要的书。素材整理部分就比较麻烦,需要将EXE、CHM、HLP等格式的打包电子书反编译成HTML或TXT,或将HTML、PDF、WORD等非文本格式转成纯TXT格式,再将各个TXT文件合并成一个大TXT文件,去掉多余的空格、段落标志,成为一个干净的素材文件。

对于独立运行的读书软件来说,只需要将整理出来的素材文件打成TCR或其它格式的压缩包,然后上传到手机即可,而对打包运行的读书软件来说,事情要复杂得多:首先需要按照手机对JAR包的尺寸限制(某些Nokia机型上要求JAR包不能超过64KB),及读书软件JAR包本身的尺寸,估算出最终JAR包里TXT文件的最大长度,然后对整理好的TXT素材文件进行分割,再一个一个打到JAR包里。

从上面的步骤可以看出,对于独立运行的读书软件来说,所有步骤都是一样的,而对打包运行的读书软件来说,只是在最后打包的时候,JAR包里的JAVA代码不同而已。因此在按照《电子书制作一条龙》的说明压了两本书后,我就开始考虑能不能做一个集成化的JAR书制作软件,在这个软件里就能搞定大部分制作步骤:

  • 这个软件不需要考虑素材收集的工作,这个就交给FlashGet、FlashFXP、Offline Explorer、eMule、BT等专业下载工具就行了。
  • 这个软件不需要考虑对EXE、CHM、HLP等的反编译,因为这些已经有UnEBook、KillEBook等软件完成;也不需要考虑PDF、WORD等转成TXT的问题,Acrobat Professional、Microsoft Word等已经够用了。
  • 这个软件需要支持批量HTML转TXT,因为这个是整理素材时最常碰到的。
  • 支持TXT文件合并、编码转换(如繁体转简体)、文件切分(给打包运行的读书软件用)、TCR文件压缩(给独立运行的读书软件用)等步骤。换句话说,就是将电子书制作过程中最具有共性的步骤集成到一个软件里完成。

在有了这个想法后,我就开始按照这个想法去扩展TextForever这个软件,目前已经基本上达到了上述目标。

对于打包运行的读书软件来说,再加上一个打JAR包的过程,上面的步骤就算圆满了。在这方面,我开始考虑的是一个我称为“JAR书平台”的概念:本文前面介绍的几个打包运行软件虽然有不同的制作软件,但是制作软件的核心任务就是根据所选的TXT文件生成index文件,然后把它们打到JAR包里去,而每一种读书软件的JAR包又是固定的。因此我想提供一个通用的平台,用户在里面选择需要打包的TXT文件,再根据自己的需要或手机型号,选择合适的JAR包,由这个平台生成index文件、打包成最终的JAR书。

我所设想的JAR书平台在技术实现上没有任何难度,关键是要取得JAR包的使用授权(俺可是守法懂礼的良民)。为此我给eBook电子书制作程序和小D的作者分别发了email,谈了我的构想,希望能够取得授权。遗憾的是前者不同意,后者无应答,看来这个想法只能胎死腹中了,不然就是哪天我自己写一个J2ME读书软件,象ReadManiac一样。

7、JAR包操作

在前面介绍的几个国内出品的打包运行读书软件中,也许是因为使用的都是已经封装好的打包程序,在实际打包前不知道打包后的文件长度,因此在制作前,都要求按照大概估计的尺寸,先将超长的TXT文件进行分割,然后再一个一个打包。如果不幸估计错误,打出来的JAR包超过了手机允许的最大长度,只能再次重复分割、打包的步骤。因此多数人为了避免麻烦,只能把文件分割小一点,宁愿最终出来的文件数目多一点,也不想返工。

而ReadManiac则没有这么麻烦:只要指定JAR包的最大长度,ReadManiac就可以自动对大文件进行分割,保证最终出来的每一个JAR包都不会超过最大尺寸。这与前面几个制作软件之间的差异,还真是一目了然又触目惊心啊。

ReadManiac能够做到这一步,我猜测是因为它内部直接调用了zlib。在所有开源的zip项目中,zlib以内存操作出名:给它一个字符串,它可以返回这个字符串压缩成zip后的实际长度,这样当然就能准确预测、控制JAR包的实际长度。zlib的官方网站是http://www.,里面不仅提供全套C源代码,还有封装好的DLL、ActiveX及Delphi接口,甚至连JAVA版源代码都有,不过我看还是以直接调用C源代码为佳。难道现在国内已经没有用C写程序的人了吗?当然不可能,最多是懒人稍多一点罢了。

ReadManiac的这个功能也是促使我想写通用JAR书平台的原因之一:只要平台提供自动分割JAR包的功能,就没有必要在不同的JAR书制作软件里重复实现这个功能了。

顺带一提,在我看到J2ME规定的唯一一个必须支持的图像格式是PNG格式时,我就猜测这与zlib有关:J2ME虚拟机通常通过zlib代码支持JAR文件,PNG同样是基于zlib的,因此对于虚拟机来说,支持PNG格式的代价最小,支持GIF、JPEG等都需要提供额外的解码代码,支持动画GIF还需要定时器或多线程。

8、理想的读书软件

在我比较了上面这些软件后,在我心目中理想的读书软件应该是酱子:

  • 象小D一样简洁明了。
  • 象MicroReader一样支持TCR压缩格式。支持ZIP的代价太大了,不要也罢。
  • 象eBook一样,支持尽可能多的J2ME平台。
  • 不论中文还是英文文章,都能有好的显示效果。

可惜以目前的技术来说,上面的要求暗含矛盾,鱼肉熊掌不可兼得,所以才说是理想啊。

9、手机设置

这个与读书软件无关,勉强算是俺看了这么久的手机电子书的一点心得。

在我看来,在手机上看书,有几个最烦恼的地方:

  • 屏幕有限,尤其是在穷人用机上。
  • 电池容量有限,难以长期坚持。
  • 存储空间有限,换句话说能够存储的书籍数有限。

当然,这些问题在高端手机上都已经得到了缓解,需要付出的代价就是白花花的银子。而我在短时间内,并不打算更换我的西门子SL55,因此只能考虑在允许的范围内,采取一些必要的措施:

  • 先将手机上的全部文件内容备份到PC机硬盘,以便在需要的时候恢复,然后删除所有用不到的图片、铃声、游戏,只留下两款MIDI格式的铃声(一款来电,一款短信)。这样一搞,可用存储空间突破1MB,再加上TCR压缩格式,一次往手机里灌7、8本书是很轻松的事(有次出差,一下就灌了10册《魔武士》)。
  • 将手机屏幕的“夜光照明”调整为10%(缺省为100%),结果耗电量大幅下降,连续阅读时间增加了近一倍。
  • 平时看中文的时候当然用MicroReader,偶尔需要看英文的时候,现装ReadManiac,用它的小字体,可以在一屏上多看点内容。
  • 平时上下班路上就算了,碰到出差,就多带一块后备电池,可以避免因为小说看得太入神,把电池看完打不了电话的尴尬。

附录 更新历史

Version 1.01
终于把JBookMaker跑起来了,因此修正对它的描述。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多