原則上來說,手機上盡量不允許大批量的操作RMS,但目前這個項目是一個閱讀軟件,不得不把下載到的書存到手機中,這就要反復操作RMS,項目期間出現過很多問題,現把幾個主要的思想記錄下來,以供在以后的項目中做為參考。
1.通過對已下載數據的RMS存儲,可以實現文件的斷點續傳;
2.通過對下載列表的記錄,可以實現已下載、正在下載、暫停,等待下載等的區分;
3.因為是反復操作RMS,所以對內存的回收一定要注意,操作結束立刻要回收;
4.因為是反復操作RMS,所以每次有設計到RMS有關的操作,必然遍歷已下載或比較書名等,都要先讀取下RMS;
5.Symbian S40系統的RMS非常有限,大致為1-2百k,不適合大數據存儲,S60理論上沒有限制,但存到20M時,有的機子會出問題;
6.本代碼范例為以對象的方式反復操作RMS,如果小范圍內使用RMS,如只記錄下用戶名密碼等,是不需要這么負責的代碼的;
代碼范例:
package com.xuudoo.booking;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.microedition.rms.RecordStore;

import com.xuudoo.ewl.EWLScreen;


public final class RMSRecorderIfno
{
private ByteArrayOutputStream dis;
private ByteArrayInputStream is;
private DataOutputStream dis1;
private DataInputStream is1;
public RecordStore rs;
private String rmsName;
public boolean boon;
private static long length;
private static boolean istrue = false;


/** *//**
* RMS命名規則:
* RecordStore.openRecordStore(storeName, false);
*
* @param storeName= "002_" + bookName + "_packet";//
* @param storeName= "002_" + bookName + "_mgz"; //存儲書
* @param storeName= "002_" + bookName + "_info"; //
* @param storeName= "002_" + bookName + "_file"; //
* @param storeName= "002_" + bookName + "_byte"; //存儲每塊數據中的廢字節數
* @param storeName= "002_" + bookName + "_url"; //存儲url和一本書的總數據塊數
* @param storeName= "002_" + "downloaded"; //存儲已經下載結束書的ID
* @param storeName= "002_" + "downloadpause"; //存儲暫停下載書的ID
*/

public RMSRecorderIfno()
{

if (!istrue)
{
istrue = true;
length = getAvailable();
}
}


/** *//**
* 打開一個倉儲
* @param name:倉儲名字
* @param flag:值為true,當不存在時創建一個新的store
* @return
*/

public final boolean open(String name, boolean flag)
{

try
{
rmsName = name;
rs = RecordStore.openRecordStore(rmsName, flag);
rs.setMode(0, true);
boon = true;

} catch (Exception e)
{
e.printStackTrace();
return false;
}
return true;
}


public final void openWriteStream()
{
dis = new ByteArrayOutputStream();
dis1 = new DataOutputStream(dis);
}

public final void closeWriteStream()
{

try
{

if (dis1 != null)
{
dis1.close();
dis1 = null;
}

if (dis != null)
{
dis.close();
dis = null;
}

} catch (IOException e)
{
e.printStackTrace();
}
}


public final void write(int k)
{

try
{
dis1.writeInt(k);
return;

} catch (Exception exception)
{
exception.printStackTrace();
}
}


public final void write(byte data[])
{

try
{
dis1.write(data);
return;

} catch (Exception exception)
{
exception.printStackTrace();
}
}


public final void write(boolean flag)
{

try
{
dis1.writeBoolean(flag);
return;

} catch (Exception exception)
{
exception.printStackTrace();
}
}


public final void write(String s)
{

try
{
dis1.writeUTF(s);
return;

} catch (Exception exception)
{
exception.printStackTrace();
}
}


public final void write(short word0)
{

try
{
dis1.writeShort(word0);
return;

} catch (Exception exception)
{
exception.printStackTrace();
}
}


public final byte[] saveStreamToByteArray()
{

try
{
dis1.flush();

} catch (Exception exception)
{
exception.printStackTrace();
}
return dis.toByteArray();
}


/** *//**
* 讀取位置K的數據
* @param k
* @return
*/

public final boolean openReadStream(int k)
{

try
{
is = new ByteArrayInputStream(getRecord(k));
is1 = new DataInputStream(is);

} catch (Exception _ex)
{
if(BookingMidlet.DEBUG)
_ex.printStackTrace();
return false;
}
return true;
}


/** *//**
* 讀取整數值
* @return
*/

public final int readInt()
{

try
{
return is1.readInt();

} catch (Exception exception)
{
if(BookingMidlet.DEBUG)
exception.printStackTrace();
return 0;
}
}


public final boolean readBoolean()
{

try
{
return is1.readBoolean();

} catch (Exception exception)
{
exception.printStackTrace();
return false;
}
}


public final String readString()
{

try
{
return is1.readUTF();

} catch (Exception exception)
{
return null;
}
}


/** *//**
* 返回數據庫中的記錄條數
* @return
*/

public final int size()
{

try
{
return rs.getNumRecords();

} catch (Exception e)
{

if(BookingMidlet.DEBUG)
{
e.printStackTrace();
}
return -1;
}
}


public final void setRecord(int k, byte abyte[])
{

try
{
rs.setRecord(k, abyte, 0, abyte.length);
return;

} catch (Exception exception)
{
exception.printStackTrace();
}
}


public final int addRecord(byte abyte0[])
{

try
{
return rs.addRecord(abyte0, 0, abyte0.length);

} catch (Exception e)
{

if(rs != null)
{
UIManager.showAlert("下載失敗,儲存器已滿,請及時清理");
}

if(UIManager._instance.downloadtool != null && UIManager._instance.downloadtool.conn != null)
{
UIManager._instance.downloadtool.CloseMidlet();
UIManager._instance.removeDownloadingItem(UIManager._instance.downloadtool.item);
UIManager._instance.removeDownloadedItem(UIManager._instance.downloadtool.item);
delete("002_" + UIManager._instance.downloadtool.imageName + "_byte");
delete("002_" + UIManager._instance.downloadtool.imageName + "_url");

if(UIManager._instance.downloadtool.rms != null)
{
UIManager._instance.downloadtool.rms.close();
UIManager._instance.downloadtool.rms = null;
}
delete("002_" + UIManager._instance.downloadtool.imageName + "_mgz");
if(BookingMidlet.DEBUG)
EWLScreen.prompt2 = "出錯了,請注意!!";
}
return -1;
}
}


/** *//**
* 讀取位置K上的字節數組數據
* @param k
* @return
*/

public final byte[] getRecord(int k)
{

try
{
return rs.getRecord(k);

} catch (Exception exception)
{
exception.printStackTrace();
exception.printStackTrace();
return null;
}
}


public final void close()
{

try
{

if (dis1 != null)
{
dis1.close();
dis1 = null;
}

if (dis != null)
{
dis.close();
dis = null;
}

if (is1 != null)
{
is1.close();
is1 = null;
}

if (is != null)
{
is.close();
is = null;
}

if (rs != null)
{
boon = false;
rs.closeRecordStore();
rs = null;
return;
}

} catch (Exception _ex)
{
_ex.printStackTrace();
}
}


public static final void delete(String s)
{

try
{
RecordStore.deleteRecordStore(s);
return;

} catch (Exception exception)
{
exception.printStackTrace();
}
}


public static final boolean a(long l)
{

if (l > 0L && l < length)
{
length -= l;
return true;

} else
{
return false;
}
}


public static final boolean b(long l)
{

if (l > 0L && length + l <= getAvailable())
{
length += l;
return true;

} else
{
return false;
}
}


public static final long h()
{
return length;
}


public static final long getAvailable()
{
long l;
RecordStore recordstore;

try
{
l = (recordstore = RecordStore.openRecordStore("freeMemory", true)).getSizeAvailable();
recordstore.closeRecordStore();
return l;

} catch (Exception exception)
{
exception.printStackTrace();
return 0L;
}
}


public static final String[] getList()
{

try
{
return RecordStore.listRecordStores();

} catch (Exception exception)
{
exception.printStackTrace();
return null;
}
}


public static final boolean exists(String name)
{
String rmslistname[] = getList();

try
{
// rs = RecordStore.openRecordStore(name, false);

} catch (Exception e)
{
e.printStackTrace();
}
if (rmslistname == null)
return false;
for (int k = 0; k < rmslistname.length; k++)
if (rmslistname[k].equals(name))
return true;
return false;
}


public static final synchronized void a(String s, int k)
{
// Object obj1 = null;

try
{
ByteArrayOutputStream bytearrayoutputstream = new ByteArrayOutputStream();
DataOutputStream obj = new DataOutputStream(bytearrayoutputstream);
obj.writeInt(k);
a(s, bytearrayoutputstream.toByteArray());
if (obj != null)
((DataOutputStream) (obj)).close();

} catch (Exception exception)
{
exception.printStackTrace();
}
}


public static final synchronized void a(String s, byte abyte0[])
{
Object obj = null;

try
{
if (((RecordStore) (obj = RecordStore.openRecordStore(s, true))).getNumRecords() == 0)
((RecordStore) (obj)).addRecord(abyte0, 0, abyte0.length);
((RecordStore) (obj)).setRecord(1, abyte0, 0, abyte0.length);

if (obj != null)
((RecordStore) (obj)).closeRecordStore();

return;

} catch (Exception e)
{
e.printStackTrace();
}
}


public static final synchronized boolean d(String s)
{
String as[];
if ((as = RecordStore.listRecordStores()) == null)
return false;
for (int k = 0; k < as.length; k++)
if (as[k].equals(s))
return true;

return false;
}


public static final synchronized int e(String s)
{
System.out.println("bn.e(string) s=" + s);
Object obj;
obj = null;
// Object obj1 = null;
int k;

try
{
obj = new ByteArrayInputStream(f(s));
DataInputStream datainputstream;
datainputstream = new DataInputStream((InputStream) (obj));
k = datainputstream.readInt();
((ByteArrayInputStream) (obj)).close();

return k;

} catch (Exception exception)
{

try
{
if (obj != null)
((ByteArrayInputStream) (obj)).close();

} catch (Exception ex)
{
ex.printStackTrace();
}
exception.printStackTrace();
return 0;
}
}


public static final synchronized byte[] f(String s)
{
System.out.println("bn.f(string) s=" + s);
byte abyte0[] = (byte[]) null;

try
{
RecordStore obj = RecordStore.openRecordStore(s, true);
if (obj.getNumRecords() == 1)
abyte0 = ((RecordStore) (obj)).getRecord(1);
if (obj != null)
obj.closeRecordStore();

return abyte0;

} catch (Exception exception)
{
exception.printStackTrace();
return null;
}
}

}
