我想将我的'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);
希望能够理解我正在努力实现的目标。欢呼声。
答案 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)
您可能希望查看DataOutputStream
和DataInputStream
。
正如@glowcoder建议的那样,数据库可以在并发用户之间进行仲裁,并且它的可扩展性更高。 H2 Database是个不错的选择。