问题描述:把多个User对象序列化的存到文件中,如何利用ObjectInputStream循环的读出我所存放的User对象??存取: User user=new User(count,userName,date1);
ObjectOutputStream oos=null;
try {
oos=new ObjectOutputStream(new FileOutputStream(file,true));
oos.writeObject(user);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
读取: File file=new File(fileName);
StringBuffer sbuffer=new StringBuffer();
//反序列化读出
ObjectInputStream ois=null;
List<User> list=new ArrayList<User>();
try {
ois=new ObjectInputStream(new FileInputStream(file));
User user=null;
while((user=(User)ois.readObject())!=null){
list.add(user);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
报错:java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1374)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at com.tjise.Test.test(Test.java:39)
at com.tjise.Test.main(Test.java:23)
ObjectOutputStream oos=null;
try {
oos=new ObjectOutputStream(new FileOutputStream(file,true));
oos.writeObject(user);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
oos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
读取: File file=new File(fileName);
StringBuffer sbuffer=new StringBuffer();
//反序列化读出
ObjectInputStream ois=null;
List<User> list=new ArrayList<User>();
try {
ois=new ObjectInputStream(new FileInputStream(file));
User user=null;
while((user=(User)ois.readObject())!=null){
list.add(user);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
报错:java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1374)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
at com.tjise.Test.test(Test.java:39)
at com.tjise.Test.main(Test.java:23)
list.add(user);
}
错误的出处;因为ObjectOutputStream有锁机制,一次只能读取一个对象
正确的做法如下:
package com.xyj.test;import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class UserSerializable2 {
public static void main(String[] args) {
// User[] users = new User[] {
// new User("张三", 20),
// new User("李四", 21)
// };
User user1 = new User("张三", 20);
User user2 = new User("李四", 21);
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
writeObjectToDisk(list);
readObjectFromDisk();
}
public static void writeObjectToDisk(List<User> list) {
File file = new File("d://user.txt");
ObjectOutputStream oos = null;
try {
oos=new ObjectOutputStream(new FileOutputStream(file, true));
oos.writeObject(list);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
@SuppressWarnings("unchecked")
public static void readObjectFromDisk() {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(new File("d://user.txt")));
List<User> list = (List<User>)ois.readObject();
// if(users!=null && users.length>0) {
// for(int i=0; i<users.length; i++) {
// System.out.println(users[i].getName()+" "+users[i].getAge());
// }
// }
for(Iterator<User> iter=list.iterator(); iter.hasNext();) {
User user = iter.next();
System.out.println(user.getName()+":"+user.getAge());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if(ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
如果不以集合或数组形式读到文件中,而是一个一个的读到文件中,还有其他方法可以取出全部的对象吗?
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;public class Test {
public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("D://12.txt"));
User u;
for(int i=0;i<2;i++){
u=new User(""+i);
out.writeObject(u);
}
out.close();
ObjectInputStream in=new ObjectInputStream(new FileInputStream("D://12.txt"));
for(int i=0;i<2;i++){
u=(User) in.readObject();
System.out.println(u.getName());
}
in.close();
}
}class User implements Serializable{
/**
*
*/
private static final long serialVersionUID = -6057757893905504974L;
private String name;
public String getName() {
return name;
}
public User(String name) {
this.name=name;
}
}