黑马程序员----浅谈RandomAccessFile格式化数据问题和多个对象序列化存取的两个方法
2015-07-17 21:59
519 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
原先的写法是:
但我们会发现,这样一来,写入的其实是2个中文,4个字节,而不是预先定好的16个字节。这样一来,在我们取数据时就非常麻烦,甚至会出错,因为我们不知道到底几个字节代表名字,而且由于每个人名字都不一样长,因此更难以处理,我们的预想是不管名字多长,我们都写入16个字节,这样在取的时候也非常方便,直接去16个字节代表名字,取4个字节代表年龄,也就是20个字节表示一个人,如下:
方式1:
简单方式:
其实我们很清楚,这个EOFException异常的发生原因,因此我们可以try...catch它,然后对其做简单处理,例如打印"已到文件末尾",甚至可以不做处理,因为我们的目的其实只是让程序不停下来而已。
优势:语法简单,就是在原本的循环外加try....catch而已
劣势:对异常的简单处理可能会造成很多别的问题,而且我们不能百分百确定每次异常触发都是因为我们设想的那种情况,如果是文件本身或者系统等其他因此触发的异常呢?那么这个问题就被我们自己掩盖了。
方式2:
将多个对象存放到集合中,例如ArrayList。
将集合序列化。
优势:不存在什么安全性问题
劣势:较为复杂
推荐使用方式2
------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培训、期待与您交流! -------
相关文章推荐
- leetcode难度及面试频率
- 阿里电话面试总结
- 黑马程序员----IO流(下)
- javaWeb面试题
- 黑马程序员——JavaIO流
- 黑马程序员----java中强大的功能-反射
- iOS--面试--收集
- 程序员父亲的遗产——编程十诫
- (剑指Offer)面试题28:字符串的排列
- 互联网蜗牛求职记--笔试面试汇总
- 互联网蜗牛求职记--笔试面试汇总
- 记录一下职业生涯第二次求职的经历
- 黑马程序员-OC-继承
- 站在互联网金字塔顶最“屌”的12位程序员
- 程序员必须知道的7大基础实用算法及其讲解
- 怎么锻炼出顶尖程序员的编码套路
- 一个面试题
- 字符串面试题:将整型转换为字符串
- 黑马程序员-----------设计模式
- 面试题总结~~(google level)