转载自:http://479001499.iteye.com/blog/2101492
在文件中末尾追加对象
用对象流写到文件中时,首先会将对象信息写到文件头才开始写具体数据.每次追加的时候也是同样.这就造成了之后读取文件的时候无法正常读取.
java帮我们读的时候只会过滤掉第一次的头部信息,之后的它没法识别.
解决办法有二:
文件较小的时候,不追加.可以先读出所有的对象,将要追加的加在后面再重新写一遍.(文件更小)
文件较大的时候,直接在后面追加.跳过头部信息不写出去了.(效率更高)
public static void read(String str) {
File file = new File(str);
try {
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
User us = (User) ois.readObject();
while (us != null) {
Server.allUser.put(us.num, us);
us = (User) ois.readObject();
}
ois.close();
System.out.println(Server.allUser);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void saveAll(String str) {
File file = new File(str);
try {
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
Set<Integer> set = Server.allUser.keySet();
for (int i : set) {
oos.writeObject(Server.allUser.get(i));
}
oos.flush();
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
new FileOutputStream(file, true);
true表示是追加.
这里我们要重写ObjectOutputStream中的writeStreamHeader方法.
因为ObjectOutputStream在writeObject的时候回调用这个方法写头信息.我们重写这个方法,不让它写头信息.这样就实现了目的了.
将 super.reset();改为super.writeStreamHeader();就会写头信息了.
在从文件中读出可以以链表的方式进行读出或者单个读出此时会遇到EOFException异常
这是因为readObject方法只能读取一次,可以用此异常来终止读出。
示例代码:
while(true){
SolrBean bean;
try{
bean = (SolrBean) ois.readObject();
}catch(EOFException e){
break;
}
list.add(bean);
}