`

ObjectOutputStream在文件末尾追加对象

阅读更多

在文件末尾追加对象

 

用对象流写到文件中时,首先会将对象信息写到文件头才开始写具体数据.每次追加的时候也是同样.这就造成了之后读取文件的时候无法正常读取.

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();
		}
	}

 

 

如上面这两个方法,一个是读取文件中的User对象,一个是将User写到文件中.这个无需过多解释

 

再看之后的追加办法:

 

public static void save(String str, User user) {
		File file = new File(str);
		try {
			FileOutputStream fos = new FileOutputStream(file, true);
			MyObjectWrite oos = new MyObjectWrite(fos);
			// 由于需要在static中创建,所以MyObjectWrite为static

			oos.writeObject(user);
			oos.flush();
			oos.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 重写对象输出流,不让它写头文件
	 * 
	 * @author Huangbin
	 *
	 */
	static class MyObjectWrite extends ObjectOutputStream {

		public MyObjectWrite(OutputStream out) throws IOException {
			super(out);// 会调用writeStreamHeader()
		}

		@Override
		protected void writeStreamHeader() throws IOException {
			super.reset();
		}

	}

 

new FileOutputStream(file, true);

 

true表示是追加.

这里我们要重写ObjectOutputStream中的writeStreamHeader方法.

因为ObjectOutputStream在writeObject的时候回调用这个方法写头信息.我们重写这个方法,不让它写头信息.这样就实现了目的了.

 

将 super.reset();改为super.writeStreamHeader();就会写头信息了.

 

 

 

0
0
分享到:
评论

相关推荐

    socket objectoutputstream 传对象 例子

    socket objectoutputstream 传对象 例子 网上找的很好用,在网上留一份

    Java保存与读取文件.rar

    Java保存与读取文件代码示例,super("存储与读取对象"); //调用父类构造函数  Container container=getContentPane(); //得到容器  Icon imageIcon=new ImageIcon("image.gif"); //实例化一个图标  ...

    python-javaobj:python-javaobj是一个python库,提供了读取Java对象序列化ObjectOutputStream的函数

    python-javaobj 是一个 python 库,它提供了读取和写入(写入当前是 WIP)Java 对象的函数,序列化或将被ObjectOutputStream反序列化。 这种对象表示形式是 Java 世界中的标准数据交换格式。 javaobj 模块公开了...

    使用Java序列化实现一个简单的文件备份工具.txt

    在该方法中,首先通过FileInputStream和ObjectInputStream读取源文件对象,然后通过ObjectOutputStream将读取的对象写入备份文件中。这个简单的示例代码展示了如何使用Java序列化来实现一个文件备份工具的简单功能,...

    使用Java的文件操作实现一个简单的通讯录管理系统.txt

    saveContactsToFile()方法使用FileOutputStream和ObjectOutputStream对象将通讯录数据写入文件中。如果写入失败,会抛出IOException异常。 addContact()方法用于添加新的联系人信息到通讯录中,并自动将更新后的...

    Java对象的序列化和反序列化实践

    当两个进程在进行远程通信时,彼此可以发送...  1)把对象的字节序列地保存到硬盘上,通常存放在一个文件中;  2)在网络上传送对象的字节序列。  一、JDK类库中的序列化API  java.io.ObjectOutputStream代表

    Java-使用序列化保存对象数据到文件学习总结

    1.2 如何将对象数据序列化保存到文件 使用ObjectOutputStream完成序列化操作: Constructor:  ObjectOutputStream(OutputStream out) Method:  void writeObject(Object obj) /** * 使用序列化实现数据的保存 *...

    java-deserialize-recovery:该项目旨在恢复使用java.io.ObjectOutputStream创建的文件

    java-反序列化恢复 该项目旨在恢复使用java.io.ObjectOutputStream创建的文件

    Java高级程序设计实战教程第五章-Java序列化机制.pptx

    序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统中,并在需要时把该流读取出来重新构造一个相同的对象。 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第2页。 5.2 ...

    TestObjectOutputStream.java

    创建ObjectOutputStream类型的对象与c:/a.txt文件关联 ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("c:/a.txt")); //2.准备User类型的对象并初始化 User u = new User("xiaomage", ...

    Java 对象存储到Oracle Blob字段

    Java 数据对象在没有持久存储到业务表时,可能需要临时存储。原因如下:有些持续时间长的任务需要数据对象,但是该任务没完成时数据对象不能持久存储;当服务在持久任务执行期间重启后恢复任务时需要数据对象。这样...

    android 面试题

    4.java.io包中的objectinputstream和objectoutputstream类主要用于对对象(Object)的读写。 5.android 中service的实现方法是:startservice和bindservice。 6.activity一般会重载7个方法用来维护其生命周期,除了...

    通讯录JAVA程序设计实验报告

    程序使用了ObjectInPutStream和ObjectOutPutStream这两个文件输入输出流,利用这两个文件输入输出流,可以方便的直接将通讯记录对象直接写入文件中,另外为了方便添加和删除一条记录还使用了系统的对象数组类...

    实验一对象序列化1

    } 由于定义了二个接口方法,方法参数分别是ObjectOutputStream和ObjectInputStream类型对象,因此这二个接口方法必须通过实现该接口

    人工智能-项目实践-搜索引擎-java实验1-实现搜索引擎的倒排索引数据结构

    如果写文本文件,推荐使用PrintWriter,当创建好PrintWriter对象后,调用其println和print方法可以将字符串一行行的写入到文本文件,使用方法与System.out.println, System.out.print完全一样 具体使用方法,请见...

    超级有影响力霸气的Java面试题大全文档

    当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...

    JDK_API_1_6

    ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。 ObjectOutputStream.PutField 提供对要写入 ObjectOutput 的持久字段的编程访问。 ObjectStreamClass 类的序列化...

    ObjectInputStream 和 ObjectOutputStream 介绍_动力节点Java学院整理

    ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持。本文给大家详细介绍了ObjectInputStream 和 ObjectOutputStream的相关知识,感兴趣的朋友一起学习吧

    JavaIOObjectStreams:FileInputStream 与 ObjectInputStream 和 ObjectOutputStream 的组合

    JavaIO对象流 FileInputStream 与 ObjectInputStream 和 ObjectOutputStream 的组合 奥利弗·缪尔

    录入输出系统

    录入输出项目,帮助网友解决问题:1、界面的切换,2、对象序列化问题ObjectInputStream ObjectOutputStream 储存数据用的记事本系列化对象的方法

Global site tag (gtag.js) - Google Analytics