1

是否可以在 RecordStore 的列中写入一个 byte[]?例如,我想写一条记录,它由第一列中的 byte[]、第二列中的 String 和第三列中的 int 组成。

public void writeToRms(byte[] byteArray){
    RecordStore recordStore = RecordStore.openRecordStore("My recordStore", true);
    try{
        byte[] outputRecord;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);
        // i want to write the parameter **byteArray** here. What method should I use?
        dos.writeUTF("Name");
        dos.writeInt(ctr);
        dos.flush();
        outputRecord = baos.toByteArray();
        recordStore.addRecord(outputRecord, 0, outputRecord.length);
        recordStore.closeRecordStore();
        baos.reset();
        baos.close();
        dos.close();
    }catch(Exception e){}
}
4

2 回答 2

1

当然。写出的基本代码byte[]是这样的:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream dos = new DataOutputStream(baos);

    // i want to write **byteArray** here. What method should I use?
    dos.writeShort(byteArray.length);
    dos.write(byteArray);

    dos.writeUTF("Name");
    dos.writeInt(ctr);
    dos.flush();
    outputRecord = baos.toByteArray();

然后当你再次读回它们时,你必须先读取数组的长度,然后再读取数组。像这样:

    RecordStore recordStore = RecordStore.openRecordStore("My recordStore", false);
    RecordEnumeration records = recordStore.enumerateRecords(null, null, true);
    while (records.hasNextElement()) {
       byte[] recordData = records.nextRecord();

       ByteArrayInputStream bais = new ByteArrayInputStream(recordData);
       DataInputStream dis = new DataInputStream(bais);

       short arrayLength = dis.readShort();
       byte[] bytes = new byte[arrayLength];
       dis.read(bytes, 0, arrayLength);

我认为这里有来自 BlackBerry 的一个很好的 RMS 示例……看看CD.java. 我知道这是一个通用的 J2ME 问题,但我不认为 BlackBerry 在这里使用了任何 RIM 特定的库……它只是标准的 J2ME。

注意:这种通用技术适用于任何类型的数组,而不仅仅是byte[]. 为了将它保存到记录存储中,您首先写出 a short,指示数组的长度,然后写出数组本身。当您重新读入它时,您首先读取一个短值,告诉您预期有多少数组元素,然后您读入数组,知道它应该有多长。

这实际上是 RMS 本身使用readUTF()和读取和写入字符串的方式writeUTF()。它写入一个指示字符串长度的 2 字节short值,然后是字符数组。

于 2013-03-06T02:55:42.160 回答
0

明白了,另一种解决方法。如果我想byte[]在 RMS 的一列中写入,我需要做的就是首先将其编码byte[]为字符串。然后专门将Base64写入StringRMS。

public void writeToRms(byte[] byteArray){
    RecordStore recordStore = RecordStore.openRecordStore("My recordStore", true);
    try{
        byte[] outputRecord;
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        DataOutputStream dos = new DataOutputStream(baos);
        String encoded = Base64.encode(byteArray);
        dos.writeUTF(encoded);
        dos.writeUTF("Name");
        dos.writeInt(ctr);
        dos.flush();
        outputRecord = baos.toByteArray();
        recordStore.addRecord(outputRecord, 0, outputRecord.length);
        recordStore.closeRecordStore();
        baos.reset();
        baos.close();
        dos.close();
    }catch(Exception e){}
}

当我检索它时,我只需要将编码解码Stringbyte[].

于 2013-03-06T03:23:43.573 回答