Java基础问题,在文件中读写对象。

packagecom.hz;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutp... package com.hz;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
class A implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
public int age;
public String name;
A(){

}
A(int age, String name){

this.age = age;
this.name = name;
}

}
public class Test3 {

public static void main(String[] args) throws IOException {

File file = new File("D:\\新建文件夹\\file.txt");
ArrayList <A> objectList = new ArrayList<A>();

if(!file.exists()){
try {
file.createNewFile();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

FileOutputStream fos = new FileOutputStream(file);

ObjectOutputStream oos = new ObjectOutputStream(fos);

A a = new A(19, "Lucy");
oos.writeObject(a);

A aa = new A(19, "Lily");
oos.writeObject(aa);

FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);

try {
if(ois.readObject() != null){
objectList.add((A)(ois.readObject()));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

for(A tempA : objectList){
System.out.println(tempA.name);

}
}}
为什么只能读出后面一个对象呢。
展开
 我来答
tenderlitch
2013-04-29 · TA获得超过174个赞
知道小有建树答主
回答量:72
采纳率:0%
帮助的人:121万
展开全部

if(ois.readObject() != null){
objectList.add((A)(ois.readObject()));
}

这里的问题。

1.if判断里读了一次,但是没有将读出的对象(Lucy,是第一次写入的对象)放到ArrayList里边去

2.if判断通过,你再次读取对象(Lily)放到list中了

所以list里边只有Lily


改成这样就好了

A readFromFile;
try {
while ((readFromFile = (A) ois.readObject()) != null) {
objectList.add(readFromFile);
}
// if (ois.readObject() != null) {
// objectList.add((A) (ois.readObject()));
// }
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (EOFException e) {
System.out.println("读取完毕");
}

PS:使用while循环是假设不知道文件里有几个序列化的对象,最后读到文件末尾抛出EOFException为止,这样做并不规范(使用异常机制来控制流程),如果你确切知道对象个数,还是使用固定循环次数的流程来读比较好(比如你这里两个就for(int i=0;i<2;i++))。

追问
嗯,这样可以读取几个对象,但是你写的第三行抛出java.io.EOFException异常了,是为什么呢。
追答
抛出EOF异常是因为读完两个对象后循环继续尝试读取。这个流没有判断文件末尾的方法(唯一的available方法返回的是能读取的字节数),所以在不知道文件结构(几个对象,都什么类型,先后顺序)的情况下只能靠捕获EOFException来结束循环。如果知道文件结构就可以不使用异常来控制循环体。
vincant566
2013-04-29 · TA获得超过902个赞
知道小有建树答主
回答量:470
采纳率:0%
帮助的人:309万
展开全部

你读取对象的那一块有错误;

改为下面就可以了:

while (true) {
try {
objectList.add((A)ois.readObject());
} catch (EOFException e) {
ois.close();
break;
}
}
追问
正解。一直读到文件末尾,跳出循环。
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式