
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);
}
}}
为什么只能读出后面一个对象呢。 展开
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);
}
}}
为什么只能读出后面一个对象呢。 展开
2个回答
展开全部
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来结束循环。如果知道文件结构就可以不使用异常来控制循环体。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询