黑马程序员技术交流社区
标题:
反序列化对象如何循环读取多个对象
[打印本页]
作者:
第一印象
时间:
2013-9-20 08:53
标题:
反序列化对象如何循环读取多个对象
本帖最后由 第一印象 于 2013-9-21 09:05 编辑
序列化对象时可以将一个装载了对象的集合中的所有对象循环存入文件中,但是反序列化时如何循环读取,一直没得到解决:
序列化代码如下:
/**
* 对象流演示
*/
public static void main(String[] args) {
//文件输出流
FileOutputStream fos = null;
//对象序列化流
ObjectOutputStream out = null;
try {
fos = new FileOutputStream("objectstream.txt");
out = new ObjectOutputStream(fos);
List<Person> pList = new ArrayList<Person>();
pList.add(new Person("张三",25));
pList.add(new Person("李四",31));
pList.add(new Person("王五",29));
for(Person p : pList){
out.writeObject(p);
out.flush();
}
} catch (Exception e) {
e.printStackTrace();
} finally{
//关流
try{
if(null != fos)
fos.close();
if(null != out)
out.close();
}catch(IOException e){
}
}
}
复制代码
反序列化代码如下,目前反序列化只能一次一次读,我觉得要是一次性存入一个文件的对象很多就不可能再这么做了,所以有没有循环读取的办法,
我试了API里,ObjectInputStream提供的很多方法基本上都行不通,不可能像读取字符流或字节流那样,通过判断read()方法返回的是不是-1来判断,所以,有什么好办法没:
public static void main(String[] args) {
//文件输入流
FileInputStream fis = null;
//对象反序列化流
ObjectInputStream in = null;
try{
fis = new FileInputStream("objectstream.txt");
in = new ObjectInputStream(fis);
//一个一个的读取流对象
Person p1 = (Person)in.readObject();
Person p2 = (Person)in.readObject();
Person p3 = (Person)in.readObject();
System.out.println(p1.getName() + ":" + p1.getAge());
System.out.println(p2.getName() + ":" + p2.getAge());
System.out.println(p3.getName() + ":" + p3.getAge());
}catch(Exception e){
e.printStackTrace();
}finally{
//关闭流
try{
if(null != fis){
fis.close();
}
if(null != in){
in.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
复制代码
Person类:
public class Person implements Serializable{
private static final long serialVersionUID = 1L;
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
复制代码
作者:
黄文伯
时间:
2013-9-20 17:14
亲,如问题已解决请将分类的“未解决”改为“已解决”。
以后的问题贴也要及时更改分类哦~
作者:
straw
时间:
2013-9-20 20:02
哥们我也找了个遍,貌似jdk还没提供这种方法如果有的话应该是readObjectes();但遗憾的是ObjectIntputStream没有那么强大.不过我们也可以有自己的方法去方便的循环获取多个对象.
由于每个获取对象到末尾的时候都会报一个EOFException异常,这就好办了.将代码这么改:
// 循环读取对象直到报EOFException异常就退出循环
Person p1;
while (true) {
try {
p1=(Person)oi.readObject();
arrayList.add(p1);
} catch (EOFException e) {
break;
}
}
复制代码
这样也可以,不过我觉得这个jdk提供的反序列化实在是不够强大啊!为什么readObject()读到数据末尾的时候不返回null呢?反而要去报一个异常!只要修改一下源代码就可是实现了,为什么开发JDK的时候就没有去这么做?郁闷啊...
作者:
第一印象
时间:
2013-9-21 08:58
straw 发表于 2013-9-20 20:02
哥们我也找了个遍,貌似jdk还没提供这种方法如果有的话应该是readObjectes();但遗憾的是ObjectIntputStream ...
这个方法也挺好,不知道jdk1.7对这个有提供解决方案没有,如果没有的话,实际开发中你这种方法可以用,还有应该可以考虑用代理,把这方法包装一下
作者:
straw
时间:
2013-9-21 11:01
我用的是JDK1.7.0_15版本的,依然没有解决这个问题,还有他们说1.7的新特性switch里变量可以是应用类型,可我这个版本没有这个特性,不知道从哪个版本开始才加这些特性的?
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2