首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2ME

J2ME 遊戲高分存檔:RMS 記錄管理系統完整操作指南

     編輯:J2ME

RMS (Record Management System) 是 J2ME 持久化存儲的核心 API,類似微型資料庫。本文面向遊戲開發者,詳細講解 RecordStore 核心操作:開啟/創建、寫入、讀取(已知/未知長度)、刪除、關閉,並提供「保存最高分」完整代碼範例。

RMS 基本概念

  • RecordStore:對應一張表,名稱唯一,屬於 MIDlet 套件私有。
  • Record:每條記錄 = recordId (int) + data (byte[])。ID 自動遞增,從 1 開始。
  • 無結構定義,開發者自行序列化/反序列化 byte[]。

核心 API 速查

基本操作流程

1. 開啟/創建


RecordStore rs = null;
try {
    rs = RecordStore.openRecordStore("highscore", true); // 不存在則創建
} catch (Exception e) {
    System.err.println("Open failed: " + e);
}

2. 寫入高分(新增或更新)


// 假設只存一條最高分,recordId 固定為 1
int score = 12345;
byte[] data = intToBytes(score); // 自行實現 int→byte[4] 大端序

try {
    if (rs.getNumRecords() == 0) {
        rs.addRecord(data, 0, data.length); // 第一次
    } else {
        rs.setRecord(1, data, 0, data.length); // 更新
    }
} catch (Exception e) { /* handle */ }

3. 讀取高分(已知長度 4 字節)


byte[] buf = new byte[4];
try {
    if (rs.getNumRecords() > 0) {
        rs.getRecord(1, buf, 0);
        int highScore = bytesToInt(buf);
    }
} catch (Exception e) { /* handle */ }

4. 讀取未知長度記錄(兩種方式)


// 方式一:預分配足夠大緩衝區
byte[] buf = new byte[100]; // 假設不超過 100 字節
int len = rs.getRecord(recordId, buf, 0); // 回傳實際讀取長度

// 方式二:先查大小再精確分配
int size = rs.getRecordSize(recordId);
byte[] exact = new byte[size];
rs.getRecord(recordId, exact, 0);

5. 刪除與關閉


// 刪除整個存儲
RecordStore.deleteRecordStore("highscore");

// 正常關閉
try { rs.closeRecordStore(); } catch (Exception e) {}

完整「最高分管理器」範例


public class HighScoreManager {
    private static final String STORE_NAME = "highscore";
    private RecordStore rs;

    public HighScoreManager() {
        try { rs = RecordStore.openRecordStore(STORE_NAME, true); }
        catch (RecordStoreException e) { e.printStackTrace(); }
    }

    public int getHighScore() {
        try {
            if (rs.getNumRecords() == 0) return 0;
            byte[] buf = new byte[4];
            rs.getRecord(1, buf, 0);
            return bytesToInt(buf);
        } catch (Exception e) { return 0; }
    }

    public void saveHighScore(int score) {
        try {
            byte[] data = intToBytes(score);
            if (rs.getNumRecords() == 0) rs.addRecord(data, 0, 4);
            else rs.setRecord(1, data, 0, 4);
        } catch (Exception e) { e.printStackTrace(); }
    }

    public void close() {
        try { if (rs != null) rs.closeRecordStore(); } catch (Exception e) {}
    }

    // 大端序 int↔byte[4]
    private static byte[] intToBytes(int v) {
        return new byte[] {
            (byte)(v >> 24), (byte)(v >> 16), (byte)(v >> 8), (byte)v
        };
    }
    private static int bytesToInt(byte[] b) {
        return ((b[0] & 0xFF) << 24) | ((b[1] & 0xFF) << 16) | ((b[2] & 0xFF) << 8) | (b[3] & 0xFF);
    }
}

遊戲中使用


// 初始化
HighScoreManager hsm = new HighScoreManager();
// 讀取顯示
int best = hsm.getHighScore();
// 遊戲結束更新
if (currentScore > best) hsm.saveHighScore(currentScore);
// 退出釋放
hsm.close();

避坑提醒

  • RMS 操作較慢,避免在遊戲主迴圈頻繁讀寫,僅在啟動/結束時操作。
  • recordId 刪除後不會重用,長期增刪會留下空洞,定期重建存儲可緩解。
  • 不同 MIDlet 套件(不同 JAR)無法互訪 RMS,需簽名同套件或用 JSR 75 文件系統共享。
  • 記住 closeRecordStore(),否則資料可能不落盤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方法用途
openRecordStore(name, createIfNecessary)開啟/創建存儲
getNumRecords()記錄總數
getRecordSize(recordId)單條記錄位元組數
getRecord(recordId)讀取整條記錄(回傳 byte[])
getRecord(recordId, buffer, offset)讀取到預分配緩衝區
addRecord(data, offset, len)新增記錄,回傳新 recordId
setRecord(recordId, data, offset, len)更新指定記錄
deleteRecord(recordId)刪除單條記錄
deleteRecordStore(name)刪除整個存儲
closeRecordStore()關閉存儲