2011-04-25 23 views
1

我想将我的“人物”对象的属性转换为可以将行写入代表每个人的文件的表示形式。许多机器需要同时读取它们分配的文件块,因此我正在从字符编码文本行移动到字节列表。我希望每个人的表现都是相同的长度我不必阅读每一个角色,阅读应用可以跳到需要开始阅读的地方。以相同长度表示的对象属性以加快阅读速度

这是我到目前为止写的,取对象的属性,并把它们放在一个形式,其中长度将始终是相同的。我可以这样做吗?我修改这段代码的时候,我做了相同的事情,但是创建了字符串表示并连接了这些字符串。

我也不能肯定,如果我的转换布尔值的方法是必要的/正确的。

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); 

希望能够理解我想要实现的。干杯。

+1

是否有任何理由,他们都必须在同一个文件?或者就此而言,为什么不把它放在数据库中呢? – corsiKa 2011-04-25 21:22:47

+0

我将最终使用分布式存储方法,但是我首先需要假设我在单个机器上停留了一个非常大的文件。欢呼 – bashcrufter 2011-04-25 21:26:51

+2

看到数据尚未写入(因为你在这篇文章中正在弄清楚如何这样做)为什么你不能使用数据库?它已经解决了这些问题。任何体面的数据库(mysql,hell甚至derby)都可以处理这个问题。 – corsiKa 2011-04-25 21:28:47

回答

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

如果你有原始类型字段的固定数量的,则编码的字节阵列将具有固定的尺寸。

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


说了这么多,机会是,如果你使用一个数据库,而不是试图自己做文件管理,你会得到一个更好的整体效果。如果您的应用程序需要搜索记录,这尤其如此。

+0

感谢您的回答。字段数量将始终如上。编译器不喜欢getBytes方法。任何想法为什么?谢谢 – bashcrufter 2011-04-26 14:08:51

+0

['toByteArray()'](http://download.oracle.com/javase/6/docs/api/java/io/ByteArrayOutputStream.html#toByteArray%28%29)? – trashgod 2011-04-26 14:21:56

+0

这似乎是正确的方法。我不得不赶上I/O异常,但仍然不会编译,因为当我尝试返回它时找不到符号'字节'。 – bashcrufter 2011-04-26 14:39:27