实体类:User
package org.chinasoft.io.serial;import java.io.Serializable;public class User implements Serializable { private static final long serialVersionUID = 1L;
private String id;
private String name;

public User(String id, String name) {
this.id = id;
this.name = name;
}

public void setId(String id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
} @Override
public String toString() {
return "id=" + id + ", name=" + name;
}

}
序列化对象的类:Serial
package org.chinasoft.io.serial;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.HashSet;
import java.util.Iterator;
import java.util.Set;public class Serial {
private ObjectInputStream ois;
private ObjectOutputStream oos;
private Set<User> users;

public Serial(File file) throws FileNotFoundException, IOException {
if(!file.exists()) {
file.createNewFile();
}
users = new HashSet<User>();
try {
ois = new ObjectInputStream(new FileInputStream(file));
} catch (Exception e) {
}
oos = new ObjectOutputStream(new FileOutputStream(file));
}

/**
 * 写对象的的操作
 *
 */
public void write() {
User u1 = new User("001", "zhangsan");
User u2 = new User("002", "lisi");
users.add(u1);
users.add(u2);
try {
oos.writeObject(users);
System.out.println("写对象操作开始...");
} catch (IOException e1) {
e1.printStackTrace();
}
}

/**
 * 读取对象的操作
 *
 */
public void read() {
Set<User> users = null;
try {
System.out.println("读对象操作开始...");
users = (Set<User>)ois.readObject();
Iterator<User> iter = users.iterator();
while(iter.hasNext()) {
User u = iter.next();
System.out.println(u);
}
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
System.out.println("OK 操作完成...");
System.out.println("Set<User> : " + users);
}
}
}
测试类:TestWriteRead
package org.chinasoft.io.serial;import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;public class TestWriteRead {

public static void main(String[] args) throws FileNotFoundException, IOException {
String path = System.getProperty("user.dir") 
+ "/src/org/chinasoft/io/serial/data";
File file = new File(path);
Serial ser = new Serial(file);
ser.write();
ser.read();
}}测试类:TestReadpackage org.chinasoft.io.serial;import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;public class TestRead {

public static void main(String[] args) throws FileNotFoundException, IOException {
String path = System.getProperty("user.dir") 
+ "/src/org/chinasoft/io/serial/data";
File file = new File(path);
Serial ser = new Serial(file);
ser.read();
}}
问题:先运行TestWriteRead.java 测试程序通过对象序列化流将保存有两个User对象的Set集合保存到本地文件,以进行持久化操作;此时打开data文件,里面是有数据的。再次运行TestRead.java测试程序通过对象序列化流读取该Set对象,当执行下面代码,调用Serial构造时候:
Serial ser = new Serial(file);
执行oos的初始化,完成之后本地data丢失,问什么啊?
oos = new ObjectOutputStream(new FileOutputStream(file));而且先前保存的对象根本就读不出来(报错),初始化该oos对象输出流而且会清空原先保存的Set集合对象,这是为什么呢?
希望知道的朋友给予解答,先谢谢了。

解决方案 »

  1.   

    new FileOutputStream(file) 会立即清空这个file
      

  2.   

    建议ObjectOutputStream oos; 这个字段作为write()方法的局部变量, 开始write时new, write完成时closeObjectInputStream ois类似处理
      

  3.   

    你说的操作是可行的,我数据之所以会清空的原因是每次new Serial这个对象的时候都会在构造中调用new ObjectOutputStream(new FileOutputStream(file));
    导致的?
      

  4.   

    没错,就是new FileOutputStream(file)导致的