在文件末尾追加对象
用对象流写到文件中时,首先会将对象信息写到文件头才开始写具体数据.每次追加的时候也是同样.这就造成了之后读取文件的时候无法正常读取.
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();就会写头信息了.
相关推荐
socket objectoutputstream 传对象 例子 网上找的很好用,在网上留一份
Java保存与读取文件代码示例,super("存储与读取对象"); //调用父类构造函数 Container container=getContentPane(); //得到容器 Icon imageIcon=new ImageIcon("image.gif"); //实例化一个图标 ...
python-javaobj 是一个 python 库,它提供了读取和写入(写入当前是 WIP)Java 对象的函数,序列化或将被ObjectOutputStream反序列化。 这种对象表示形式是 Java 世界中的标准数据交换格式。 javaobj 模块公开了...
在该方法中,首先通过FileInputStream和ObjectInputStream读取源文件对象,然后通过ObjectOutputStream将读取的对象写入备份文件中。这个简单的示例代码展示了如何使用Java序列化来实现一个文件备份工具的简单功能,...
saveContactsToFile()方法使用FileOutputStream和ObjectOutputStream对象将通讯录数据写入文件中。如果写入失败,会抛出IOException异常。 addContact()方法用于添加新的联系人信息到通讯录中,并自动将更新后的...
当两个进程在进行远程通信时,彼此可以发送... 1)把对象的字节序列地保存到硬盘上,通常存放在一个文件中; 2)在网络上传送对象的字节序列。 一、JDK类库中的序列化API java.io.ObjectOutputStream代表
1.2 如何将对象数据序列化保存到文件 使用ObjectOutputStream完成序列化操作: Constructor: ObjectOutputStream(OutputStream out) Method: void writeObject(Object obj) /** * 使用序列化实现数据的保存 *...
java-反序列化恢复 该项目旨在恢复使用java.io.ObjectOutputStream创建的文件
序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统中,并在需要时把该流读取出来重新构造一个相同的对象。 Java高级程序设计实战教程第五章-Java序列化机制全文共15页,当前为第2页。 5.2 ...
创建ObjectOutputStream类型的对象与c:/a.txt文件关联 ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("c:/a.txt")); //2.准备User类型的对象并初始化 User u = new User("xiaomage", ...
Java 数据对象在没有持久存储到业务表时,可能需要临时存储。原因如下:有些持续时间长的任务需要数据对象,但是该任务没完成时数据对象不能持久存储;当服务在持久任务执行期间重启后恢复任务时需要数据对象。这样...
4.java.io包中的objectinputstream和objectoutputstream类主要用于对对象(Object)的读写。 5.android 中service的实现方法是:startservice和bindservice。 6.activity一般会重载7个方法用来维护其生命周期,除了...
程序使用了ObjectInPutStream和ObjectOutPutStream这两个文件输入输出流,利用这两个文件输入输出流,可以方便的直接将通讯记录对象直接写入文件中,另外为了方便添加和删除一条记录还使用了系统的对象数组类...
} 由于定义了二个接口方法,方法参数分别是ObjectOutputStream和ObjectInputStream类型对象,因此这二个接口方法必须通过实现该接口
如果写文本文件,推荐使用PrintWriter,当创建好PrintWriter对象后,调用其println和print方法可以将字符串一行行的写入到文本文件,使用方法与System.out.println, System.out.print完全一样 具体使用方法,请见...
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 20、abstract class和interface有什么区别? ...
ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。 ObjectOutputStream.PutField 提供对要写入 ObjectOutput 的持久字段的编程访问。 ObjectStreamClass 类的序列化...
ObjectInputStream 和 ObjectOutputStream 的作用是,对基本数据和对象进行序列化操作支持。本文给大家详细介绍了ObjectInputStream 和 ObjectOutputStream的相关知识,感兴趣的朋友一起学习吧
JavaIO对象流 FileInputStream 与 ObjectInputStream 和 ObjectOutputStream 的组合 奥利弗·缪尔
录入输出项目,帮助网友解决问题:1、界面的切换,2、对象序列化问题ObjectInputStream ObjectOutputStream 储存数据用的记事本系列化对象的方法