RMS 只存 byte[],將對象「壓扁」為位元組流、再「膨脹」回對象,是所有持久化與網絡傳輸的基礎功。CLDC 的 IO 輕量且與 J2SE/J2EE 通用,掌握它等於掌握了跨平台數據交換的鑰匙。
| 類 | 作用 |
|---|---|
| ByteArrayInputStream | byte[] → 流 |
| ByteArrayOutputStream | 內存緩衝區 → byte[] |
| DataInputStream | 讀基本類型 + String |
| DataOutputStream | 寫基本類型 + String |
典型組合:new DataOutputStream(new ByteArrayOutputStream()) → 寫入 → toByteArray() 取得 byte[]。
標準 toByteArray() 會複製內部緩衝區,雙倍內存對移動設備致命。擴展類實現零拷貝:
public class MyByteArrayOutputStream extends ByteArrayOutputStream {
public byte[] getByteArray() { return buf; } // 直接返回內部緩衝區引用
}
public class Bank {
private String bankName;
private String phone;
private int employeeNum;
// 構造器、getter 省略...
// 序列化:對象 → byte[]
public byte[] serialize() throws IOException {
MyByteArrayOutputStream bos = new MyByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeUTF(bankName);
dos.writeUTF(phone);
dos.writeInt(employeeNum);
dos.flush();
return bos.getByteArray(); // 零拷貝
}
// 反序列化:byte[] → 對象
public Bank deserialize(byte[] data) throws IOException {
ByteArrayInputStream bis = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bis);
Bank bank = new Bank();
bank.bankName = dis.readUTF();
bank.phone = dis.readUTF();
bank.employeeNum = dis.readInt();
return bank;
}
}
// 寫入
Bank aBank = ...;
RecordStore rs = ...;
try {
byte[] data = aBank.serialize();
rs.addRecord(data, 0, data.length);
} catch (IOException | RecordStoreException e) { /* handle */ }
// 讀取
byte[] data = rs.getRecord(recordId);
Bank aBank = new Bank().deserialize(data);
UTFDataFormatException、EOFException 均需捕獲深入 RecordStore 進階操作:RecordEnumeration 游標遍歷、RecordFilter/RecordComparator 過濾排序、RecordListener 變更通知、多線程同步最佳實踐。