这几天做一个小的聊天项目用到对象序列化的知识,发现对象序列化不能像普通文件一样直接追加对象。每次写入对象都会被覆盖。弄了2个多小时终于解决了。Java默认的对象序列化是每次写入对象都会写入一点头aced 0005(占4个字节),然后每次读取都读完头然后在读内容。解决方法就是先判断文件是否存在。如果不存在,就先创建文件。然后写了第一个对象,也写入了头aced 0005。追加的情况就是当判断文件存在时,把那个4个字节的头aced 0005截取掉,然后在把对象写入到文件。这样就实现了对象序列化的追加。代码如下:

首先我们要写一个对类,用于对象的序列化,这个类实现了Serializable接口。类的定义如下:

package qq.client.tools;

import java.io.*;
/**
* 这是对象序列化的程序
* 实现了对象序列化的追加
* @author Administrator
*
*/ public class ObjectOutputTest { /**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Message m = new Message();
m.setName("aaaaaaaaaaaaaaaaaaaaa");
File file=new File("D:\\jjm.txt");
boolean isexist=false;//定义一个用来判断文件是否需要截掉头aced 0005的
if(file.exists()){ //文件是否存在
isexist=true;
FileOutputStream fo=new FileOutputStream(file,true);
ObjectOutputStream oos = new ObjectOutputStream(fo);
long pos=0;
if(isexist){
pos=fo.getChannel().position()-4;//追加的时候去掉头部aced 0005
fo.getChannel().truncate(pos);
}
oos.writeObject(m);//进行序列化
System.out.println("追加成功");
}else{//文件不存在
file.createNewFile();
FileOutputStream fo=new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fo);
oos.writeObject(m);//进行序列化
oos.close();
System.out.println("首次对象序列化成功!");
}
} }

下面是反系列化的实现。注意要在循环外面关闭流,在里面关闭会出现句柄无效的错误。

package qq.client.tools;

import java.io.*;

public class ObjectInputTest {

	/**这是反序列化的程序
* 实现从文件读取多个对象
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub File file = new File("D:"+File.separator+"jjm.txt");
if(file.exists()){
ObjectInputStream ois;
try {
FileInputStream fn=new FileInputStream(file);
ois = new ObjectInputStream(fn);
while(fn.available()>0){//代表文件还有内容
Message p = (Message)ois.readObject();//从流中读取对象 System.out.println(p.getName()); } ois.close();//注意在循环外面关闭
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}

  整个序列化对象的追加与从文件读取多个对象实就实现了。

Java对象序列化文件追加对象的问题,以及Java的读取多个对象的问题解决方法。的更多相关文章

  1. Java程序设计——对象序列化

    对象序列化的目标是将对象保存到磁盘中或允许在网络中直接传输对象,对象序列化机制允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上,通过网络将这种二进制流传输到另 ...

  2. Java对象序列化剖析

    对象序列化的目的 1)希望将Java对象持久化在文件中 2)将Java对象用于网络传输 实现方式 如果希望一个类的对象可以被序列化/反序列化,那该类必须实现java.io.Serializable接口 ...

  3. JAVA基础学习day22--IO流四-对象序列化、管道流、RandomAccessFile、DataStream、ByteArrayStream、转换流的字符编码

    一.对象序列化 1.1.对象序列化 被操作的对象需要实现Serializable接口 1.2.对象序列化流ObjectOutputStream与ObjectInputStream ObjectInpu ...

  4. java 对象序列化

    java 对象序列化 package org.rui.io.serializable; import java.io.ByteArrayInputStream; import java.io.Byte ...

  5. java 对象序列化 RMI

    对于一个存在于Java虚拟机中的对象来说,其内部的状态只保持在内存中.JVM停止之后,这些状态就丢失了.在很多情况下,对象的内部状态是需要被持久化下来的.提到持久化,最直接的做法是保存到文件系统或是数 ...

  6. 谈谈 JAVA 的对象序列化

    所谓的『JAVA 对象序列化』就是指,将一个 JAVA 对象所描述的所有内容以文件 IO 的方式写入二进制文件的一个过程.关于序列化,主要涉及两个流,ObjectInputStream 和 Objec ...

  7. Java对象序列化全面总结

    前言 Java允许我们在内存中创建可复用的Java对象,但一般情况下,这些对象的生命周期不会比JVM的生命周期更长.但在现实应用中,可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重 ...

  8. Java对象序列化与RMI

    对于一个存在于Java虚拟机中的对象来说,其内部的状态只保持在内存中.JVM停止之后,这些状态就丢失了.在很多情况下,对象的内部状态是需要被持久化下来的.提到持久化,最直接的做法是保存到文件系统或是数 ...

  9. 为什么java需要序列化对象

    序列化是一种用来处理对象流的机制 所谓对象流:就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可将流化后的对象传输与网络之间 序列化是为了解决在对象流进行读写操作时所引发的问题 序列化的实 ...

随机推荐

  1. CSS3与页面布局学习笔记(二)——盒子模型(Box Model)、边距折叠、内联与块标签、CSSReset

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...

  2. [deviceone开发]-HeaderView和FooterView的示例

    一.简介 这个是利用do_ListView组件实现下拉和上拉刷新功能的例子,除了do_ListView,其它比如do_Webview,do_ScrollView都有这个个功能.对应的BBS里的帖子详细 ...

  3. 深入了解SQL注入绕过waf和过滤机制

    知己知彼百战不殆 --孙子兵法 [目录] 0x00 前言 0x01 WAF的常见特征 0x02 绕过WAF的方法 0x03 SQLi Filter的实现及Evasion 0x04 延伸及测试向量示例 ...

  4. 系统补丁对sharepoint很重要

    系统补丁对sharepoint很重要,会提高sharepoint运行效率,加载速度明显变快.

  5. word第一讲(0723)

    工作区导航 F6键:从程序窗口中的一个任务窗格移动到另一个任务窗格.(在菜单栏.工作区.状态栏切换) alt键选中选项卡.左右键切换选项卡.下光标切换到选项卡里具体内容. 设置版面 页面布局-> ...

  6. App 即时通讯 SDK

    1.网易云信 http://netease.im/ 2.环信 http://www.easemob.com/customer/im 3.融云 http://www.rongcloud.cn/ 4.极光 ...

  7. NSoperation用法详解及与GCD的比较

    NSInvocationOperation // 基于一个对象和selector来创建操作.如果你已经有现有的方法来执行需要的任务,就可以使用这个类 NSInvocationOperation * o ...

  8. iOS sqlite3 的基本使用(增 删 改 查)

    iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...

  9. iOS之 HTTP、Socket、TCP的区别(易混

    一.HTTP 是一种超文本传输协议,全名hypertext transfer protocol,从字面意思上可以看出该协议用于规定客户端与服务端之间的传输规则, 传输的内容不限于文本(任意类型的数据) ...

  10. 实战CENTOS6.5安装docker并创建asp.net mvc 5 镜像,运行MVC 网站

    Docker,容器,让研发.测试.生产同一环境,可在linux平台上混合使用JAVA与net 程序 Centos6.5安装docker 参考http://my.oschina.net/kcw/blog ...