黑马程序员----浅谈RandomAccessFile格式化数据问题和多个对象序列化存取的两个方法

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

1.RandomAccessFile格式化数据问题

当我们向其中存放数据时,为了取的方便,通常我们定义一个统一的格式,例如用int表示年龄,也就是4个字节但是对于名字可能比较麻烦,这里为了照顾到全部中国人的姓名,我们使用16个字节,也就是8个字符表示名字,那么这样一来我们该如果写入数据呢?

原先的写法是:

byte[] by=new byte[16];
by="何龙".getBytes();
raf.write(by);

但我们会发现,这样一来,写入的其实是2个中文,4个字节,而不是预先定好的16个字节。这样一来,在我们取数据时就非常麻烦,甚至会出错,因为我们不知道到底几个字节代表名字,而且由于每个人名字都不一样长,因此更难以处理,我们的预想是不管名字多长,我们都写入16个字节,这样在取的时候也非常方便,直接去16个字节代表名字,取4个字节代表年龄,也就是20个字节表示一个人,如下:

byte[] by=new byte[16];
by=Arrays.copyOf("何龙".getBytes(),16);
raf.write(by);


2.多个对象序列化存取的两个方法

最近学到对象的序列化,练习的时候打算序列化多个对象,但是发现总是报EOFException异常,查阅发现这是因为当我们已经读到文件末尾时还没停止,继续读就会报这个异常,但是由于readObject返回的是Object类型,即便设置了obj!=null这个条件也解决不了问题,因此通过各种方式目前找到以下两种解决方式。

方式1:

简单方式:

其实我们很清楚,这个EOFException异常的发生原因,因此我们可以try...catch它,然后对其做简单处理,例如打印"已到文件末尾",甚至可以不做处理,因为我们的目的其实只是让程序不停下来而已。

优势:语法简单,就是在原本的循环外加try....catch而已

劣势:对异常的简单处理可能会造成很多别的问题,而且我们不能百分百确定每次异常触发都是因为我们设想的那种情况,如果是文件本身或者系统等其他因此触发的异常呢?那么这个问题就被我们自己掩盖了。


方式2:

将多个对象存放到集合中,例如ArrayList。

将集合序列化。

优势:不存在什么安全性问题

劣势:较为复杂


推荐使用方式2









------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

你可能感兴趣的:(黑马程序员----浅谈RandomAccessFile格式化数据问题和多个对象序列化存取的两个方法)