Java 在RMS列中写入字节[]

Java 在RMS列中写入字节[],java,java-me,bytearray,rms,Java,Java Me,Bytearray,Rms,是否可以在RecordStore的列中写入字节[]?例如,我想写一条记录,它由第一列中的字节[]、第二列中的字符串和第三列中的int组成 public void writeToRms(byte[] byteArray){ RecordStore recordStore = RecordStore.openRecordStore("My recordStore", true); try{ byte[] outputRecord; ByteArrayO

是否可以在RecordStore的列中写入字节[]?例如,我想写一条记录,它由第一列中的字节[]、第二列中的字符串和第三列中的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){}
}

当然。写出
字节[]
的基本代码如下:

    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);
我想有一个。。。看看
CD.java
。我知道这是一个一般的J2ME问题,但我不认为BlackBerry在这里使用了任何特定于RIM的库。。。它只是标准的J2ME

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


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

当然。写出
字节[]
的基本代码如下:

    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);
我想有一个。。。看看
CD.java
。我知道这是一个一般的J2ME问题,但我不认为BlackBerry在这里使用了任何特定于RIM的库。。。它只是标准的J2ME

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


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

得到它,另一种解决方案。如果我想在RMS的一列中写入
byte[]
,我需要做的就是首先将
byte[]
编码为字符串。然后将
字符串
写入RMS

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){}
}

当我检索它时,我只需要将编码的
字符串
解码回
字节[]

得到它,另一个解决方案。如果我想在RMS的一列中写入
byte[]
,我需要做的就是首先将
byte[]
编码为字符串。然后将
字符串
写入RMS

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){}
}

当我检索它时,我只需要将编码的
字符串
解码回
字节[]

谢谢你的回复。我编辑了我的问题,我说的是将参数byteArray(一个字节[])作为列之一写入Rms。这就是我向您展示的。您将参数的名称从
myRecord
更改为
byteArray
。这并没有真正改变解决方案。我更改了名称以使其更易于理解。对不起,我以为你把我的问题看错了,就像昨天另一个人试图回答我的问题一样。我的答案肯定更好。首先,它只使用了两行代码(除了问题中已有的代码之外)。您可以编写一个2字节的长度(
short
)。然后编写
字节[]
。就这样。在您发布的另一个解决方案中,您仍然有额外的2个字节要写,指定
字符串的长度(这就是
writeUTF(String)
的工作方式…它写出2个字节,指定字符串的长度)。另一种解决方案还将
byte[]
添加到
String
编码中,它不提供任何值,只需要更多的CPU处理。没必要这么做,不客气。我还要指出,唱片存储空间是有限的。base64编码字节[]的另一个问题是它会变长。因此,如果您有许多这样的记录,那么另一种方法将在RMS存储中占用更多的空间。我没有足够的空间在我最后的评论中说。。。空间不够:)谢谢你的回复。我编辑了我的问题,我说的是将参数byteArray(一个字节[])作为列之一写入Rms。这就是我向您展示的。您将参数的名称从
myRecord
更改为
byteArray
。这并没有真正改变解决方案。我更改了名称以使其更易于理解。对不起,我以为你把我的问题看错了,就像昨天另一个人试图回答我的问题一样。我的答案肯定更好。首先,它只使用了两行代码(除了问题中已有的代码之外)。您可以编写一个2字节的长度(
short
)。然后编写
字节[]
。就这样。在您发布的另一个解决方案中,您仍然有额外的2个字节要写,指定
字符串的长度(这就是
writeUTF(String)
的工作方式…它写出2个字节,指定字符串的长度)。另一种解决方案还将
byte[]
添加到
String
编码中,它不提供任何值,只需要更多的CPU处理。没必要这么做,不客气。我还要指出,唱片存储空间是有限的。base64编码字节[]的另一个问题是它会变长。因此,如果您有许多这样的记录,那么另一种方法将在RMS存储中占用更多的空间。我没有足够的空间在我最后的评论中说。。。没有足够的空间:)这将正常工作,但正如我在中所说