欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 是在对记录仓储的操作动作完成以后被调用的!
	
	
	
	
	
	
	
	

}
相关标签: J2ME RMS