Java 在RMS列中写入字节[]
是否可以在RecordStore的列中写入字节[]?例如,我想写一条记录,它由第一列中的字节[]、第二列中的字符串和第三列中的int组成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
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存储中占用更多的空间。我没有足够的空间在我最后的评论中说。。。没有足够的空间:)这将正常工作,但正如我在中所说