对象属性为相同长度的表示,以便更快地读取

时间:2011-04-25 21:17:45

标签: java

我想将我的'person'对象的属性转换为表示我可以将行写入代表每个人的文件的表示。许多机器需要同时读取它们分配的文件块,因此我将从字符编码文本行转移到字节列表。我希望每个人的表达都是相同的长度我不必阅读每个角色,阅读应用程序可以“跳”到需要开始阅读的位置。

这是我到目前为止所写的内容,它采用对象的属性并将它们放入长度始终相同的表单中。我可以这样做吗?我修改了这段代码,因为我做了同样的事情,但是用于创建字符串表示并连接这些字符串。

我也不确定我的转换布尔值的方法是否必要/正确。

byte[] person = new byte[8];
person[0] = Integer.byteValue(age);
if (gender.equals('m')) {person[1] = Integer.byteValue(1);}
else {person[1] = Integer.byteValue(0);}
person[2] = Integer.byteValue(children);
person[3] = Integer.byteValue(goodHealth? 1:0);
person[4] = Integer.byteValue(cars);
person[5] = Integer.byteValue(avgWeekShopping);
person[6] = Integer.byteValue(salary);
person[7] = Integer.byteValue(smoker? 1:0);

希望能够理解我正在努力实现的目标。欢呼声。

2 个答案:

答案 0 :(得分:2)

阐述@ trashgod的答案,你的问题可分为两部分;编码数据并确保编码数据可以在相同长度的记录中表示。

对数据进行编码的明显方法如下:

byte[] bytes;
try {
    ByteArrayOutputStream baos = new ByteArrayOutputStream(/* size hint */);
    DataOutputStream dos = new DataOutputStream(baos);
    dos.writeInt(age);
    dos.writeBoolean(gender.equals('m'));
    dos.writeInt(children);
    dos.writeBoolean(goodHealth);
    dos.writeInt(cars);
    dos.writeInt(avgWeekShopping);
    dos.writeInt(salary);
    dos.writeBoolean(smoker);
    bytes = baos.toByteArray();
} catch (IOException ex) {
    throw new AssertionError("this can't happen", ex);
}

如果您有固定数量的具有基本类型的字段,则编码的字节数组将具有固定大小。

如果您有可变数量的字段或可变长度字符串,那么编码字节数组的大小将是可变的。要解决这个问题,您需要选择一些最大记录大小,并将所有编码的字节数组填充到该大小。


话虽如此,如果您使用数据库而不是尝试自己进行文件管理,则可能会获得更好的整体结果。如果您的应用程序需要搜索记录,则尤其如此。

答案 1 :(得分:1)

您可能希望查看DataOutputStreamDataInputStream

正如@glowcoder建议的那样,数据库可以在并发用户之间进行仲裁,并且它的可扩展性更高。 H2 Database是个不错的选择。