J2ME的RMS
在JAVAME中,程序的数据保存的地方,无外乎两种,一种是把数据保存在RMS里面,这是所有的JAVAME的手机都支持的,还有一种就是把数据保存在手机的文件系统里面,这个不是所有手机都能支持的,只有支持JSR075的手机,才支持把数据保存在文件系统里面,并且如果你的程序没有经过签名的话,你每次保存或者读取,手机都会弹出恼人的提示,是否允许程序访问文件系统。所在我一般都是把数据存在RMS里面,因为读写RMS是安全的,并且也是不需要手机提示的。因为我们的RMS数据是存在一个特殊的地方。
Record Management System是J2ME的一个重要的子系统,目的是实现应用程序本地数据的持久性存储。目前支持文件系统的移动信息设备还有限,因此RMS是J2ME开发人员实现本地数据存储的首选途径。
关于j2me中RMS存储容量的问题,一般手机提供给RMS的容量只有30k左右的空间,当存储大量数据时很容易跑出 RecordStoreFullException异常,表示存储空间已满。
RMS(Record Management System)是首先在MIDP1.0中提出的,它所在的包是javax.microedition.rms。利用他可以在没有任何数字签名的情况下在手机中进行信息的读写工作。
要使用RMS,首先需要通过RecordStore类的静态方法,构造一个RecordStore类,来进行RMS操作。具体语法:
RecordStore rms = RecordStore.openRecordStore("myrmslog", true, RecordStore.AUTHMODE_ANY, true);
其中,"myrmslog":是我们的log文件的名字,这里需要注意,实际通过RMS存储的文件名是一系列扩展前缀与这个名字的组合作为log文件的名字,而不是简单的指定。
第二个boolean参数:标识了如果指定名字的文件不存在是否允许程序自己创建这个文件。
第三个整形参数:标识了这个log文件的访问权限,我们这里使用RecordStore.AUTHMODE_ANY表明这个log文件允许任何其他MIDlet程序访问。
第四个boolean参数:表明了任何其他MIDlet程序是否能够修改这个log文件。
这样就打开了一个RecordStore,接下来就是通过RecordStore进行RMS操作了,主要就是一条语句:
rms.addRecord(record, 0, record.length);
其中record是要写入RMS文件中的内容,这里应该是一个byte数组(可以使用String.getBytes()方法得到任意字符串的byte数组。)
这样一条记录便被保存到了RMS中,如果想要再填入其他内容,则重复执行上述语句即可。
最后,不要忘了,填入完所有内容后,要记得关闭RMS文件:
rms.closeRecordStore();
一个使用的例子大概像下面这样,在这个例子中我们通过循环写了100条内容到RMS中:
RecordStore rms = RecordStore.openRecordStore("myrmslog", true,RecordStore.AUTHMODE_ANY, true);
for(int i = 0; i < 100; i++){
String str = i + "test log";
byte[] record = str.getBytes();
rms.addRecord(record, 0, record.length);
}
rms.closeRecordStore();
写入之后,我们要再写另外的程序来读取我们的Log内容。同样的,第一步需要使用RecordStore类的静态方法,构造一个RecordStore类,但是这里的参数需要变化一下,下面我们说明:
recordStore = RecordStore.openRecordStore(RMS_NAME, VENDOR_NAME, MIDLETSUITE_NAME);
其中
RMS_NAME:就是我们上面写入RMS时指定的文件名字,只要和写入时指定的一样即可,那些额外附加上的前缀是由系统来处理的并不需要我们关心。
VENDOR_NAME:必须与我们写入RMS程序的Vender名字完全相同,这个名字可以在程序的Jad文件中找到,就是Midlet Vendor这一项。
MIDLETSUITE_NAME:必须与我们写入RMS程序的Midlet名字完全相同,这个名字同样可以在程序的Jad文件中找到,就是Midlet Name这一项。
这样我们就得到了一个RecordStore类。下面就可以使用这个类来读取我们之前写入的Log内容了:
RecordEnumeration re = recordStore.enumerateRecords(null, null, true);
while (re.hasNextElement()) {
int id=re.nextRecordId();
byte b[] = this.recordStore.getRecord(id);
System.out.println(new String(b));//这里可以修改成任意需要的处理。
}
读取完毕后同样要记得关闭RecordEnumeration 和 RecordStore:
re.destroy();
recordStore.closeRecordStore();
参考文献:http://hi.baidu.com/%C2%ED%B7%FE%CA%E9%C4%FE/blog/item/32ea45024e447a0b4afb516e.html
上一篇: 360 壁纸