RMS 记录管理系统
程序员文章站
2022-03-02 19:36:49
...
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import javax.microedition.rms.InvalidRecordIDException; import javax.microedition.rms.RecordComparator; import javax.microedition.rms.RecordEnumeration; import javax.microedition.rms.RecordStore; import javax.microedition.rms.RecordStoreException; import javax.microedition.rms.RecordStoreFullException; import javax.microedition.rms.RecordStoreNotFoundException; import javax.microedition.rms.RecordStoreNotOpenException; // RMS RescordManagement System 记录管理系统--是一种数据持久化机制 // RMS 就是一个小型的数据管理系统 // 特点:以简单的,类似表格的形式组织信息,并存储起来形成持久化存储,以供 // 应用程序在重新启动后继续使用! // 概念: Records--记录 // Records Stores--记录仓储 // Records Stores :代表一组记录的集合;同一MIDlet ,每个仓储的名字是独一无二的 ;大小<32个Unicode字符 // 同一个MIDlet 可以共享这些记录仓储 // Record : 一条记录的组成:整型的RecordID ,代表数据的byte[] 组成 // RecordID: 每条记录的唯一标示;特点:RecordID 是每条记录的唯一标识,使用的是简单的单增算法, // 对应的记录被删除后RecordID ,不会被使用,仓储中相邻的记录并不一定会有连续的ID // 示例:RecordStroe 的管理 - public class RMSTest extends MIDlet implements RecordComparator{ private RecordStore rs ; protected void destroyApp(boolean arg0) throws MIDletStateChangeException { try { //RMS 的关闭:MIDlet 套件需要在RMS 的开启与关闭之间保持平衡 // 特点:打开了多少个仓储 , 就要有多少个关闭的方法 rs.closeRecordStore(); //delete RecordStore //删除之前必须保证记录仓储是关闭的状态 RecordStore.deleteRecordStore("myRecordStore"); } catch (RecordStoreNotOpenException e) { e.printStackTrace(); } catch (RecordStoreException e) { e.printStackTrace(); } } protected void pauseApp() { // TODO Auto-generated method stub } //start application protected void startApp() throws MIDletStateChangeException { // TODO Auto-generated method stub try { //RecordStore 通过静态方法来获取对象 // 参数:1、记录仓储名称 2、不存在时是否创建 //打开一个 RMS , 打开失败则创建 rs = RecordStore.openRecordStore("myRecordStore", true); //添加记录 int id = addRecord("zhang张"); System.out.println("数据的记录ID 为:"+id); //获取记录 System.out.println(getRecord(id)); //RecordStore 的方法,获取记录仓储的信息 System.out.println("记录仓储最后更新的时间是:"+rs.getLastModified()); System.out.println("获取已经打开了的记录仓储的名称:"+rs.getName()); System.out.println("获取当前记录仓储中记录的总数:"+rs.getNumRecords()); System.out.println("获取当前仓储中可用的字节数:"+rs.getSizeAvailable()); System.out.println("获取记录仓储的版本号:"+rs.getVersion()); System.out.println("获取该MIDlet套件中所有的记录仓储列表:"+rs.listRecordStores()); this.viewAll(); } catch (RecordStoreFullException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RecordStoreNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RecordStoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //增加记录 //RecordStore 的基本操作: // addRecord(byte[] data,int offset,int numBytes),参数:byte[]数组,传入数组的起始位置,传入数据长度 // addRecord(); 当数据添加成功后,方法将返回记录ID号,RecordID----简单增长 public int addRecord(String source){ int rec = -1; //初始化状态 //创建字节数组输出流 ByteArrayOutputStream baos = new ByteArrayOutputStream(); //创建数据输出流 --传入字节数组输出流对象 DataOutputStream dos = new DataOutputStream(baos); try { //写入数据 dos.writeUTF(source); //关闭流 dos.close(); baos.close(); //获取byte 数组 byte[] bytes = baos.toByteArray(); System.out.println("bytes的数量为:"+bytes.length); //添加记录 rec = rs.addRecord(bytes,0, bytes.length); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return rec; } //获取数据 public String getRecord(int RecordID){ String record = ""; byte[] data; try { //通过记录ID 获取字节数组 data = rs.getRecord(RecordID); //读出,获取数据 ByteArrayInputStream bais = new ByteArrayInputStream(data); DataInputStream dis = new DataInputStream(bais); record = dis.readUTF(); //关闭流 dis.close(); bais.close(); } catch (RecordStoreNotOpenException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvalidRecordIDException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RecordStoreException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch(Exception ex){ ex.printStackTrace(); } return record; } //RecordStore 的高级部分 // 接口的使用:四个接口:RecordComparator,RecordEnumeration,RecordFilter ,RecordListener //RecordEnumeration 遍历接口--可靠的走访方式 //案例:获取仓储中所有的单词 public String[] viewAll(){ System.out.println("欢迎进入RecordEnumeration遍历接口的测试......."); String[] words = new String[0]; RecordEnumeration re = null; //rs 记录仓储对象 if(rs==null){ return words; } try { re = rs.enumerateRecords(null, null, false); //re.numRecords(); 返回在当前遍历中可用的集合,也满足filter存在的时候 int recordSum = re.nextRecord().length; System.out.println("当前集合中可用的记录数目为:"+recordSum); words = new String[recordSum]; int wordRecords = 0; while(re.hasNextElement()){ //hasNextElement(); 指定当前指向的位置还有没有记录 System.out.println("下一位置的记录拷贝为:"+re.nextRecord()); byte[] temp = re.nextRecord(); //re.nextRecord(); 返回遍历器中下一位置的记录拷贝(修改不影响记录仓储中的值); System.out.println(temp); // words[wordRecords] =temp[wordRecords] ; wordRecords++; } } catch (RecordStoreNotOpenException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch(Exception ex){ ex.printStackTrace(); } return words; } //RecordFilter 过滤接口 //过滤接口是用来过滤不满足条件的记录 //RecordComparator 比较器接口 public int compare(byte[] rec1, byte[] rec2) { //RecordComparator 必须实现的方法: // TODO Auto-generated method stub return 0; } //RecordListener 接口 // 用来接受监听记录仓储中记录添加,更改或删除记录事件的接口 //必须实现的方法:recordAdded();recordChanged();recordDeleted(); --都需要传入两个参数:仓储名,记录id //注:RecordListener 是在对记录仓储的操作动作完成以后被调用的! }