`

将多个对象写到一个文件

 
阅读更多

来看一段ObjectOutputStream构造方法的源代码

public ObjectOutputStream(OutputStream out) throws IOException {  
    verifySubclass();  
    bout = new BlockDataOutputStream(out);  
    handles = new HandleTable(10, (float) 3.00);  
    subs = new ReplaceTable(10, (float) 3.00);  
    enableOverride = false;  
    /
     * The writeStreamHeader method is provided so subclasses can append or
     * prepend their own header to the stream.  It writes the magic number and
     * version to the stream.
     *
     * @throws  IOException if I/O errors occur while writing to the underlying
     *      stream
     */
    
writeStreamHeader();  


    bout.setBlockDataMode(true);  
        if (extendedDebugInfo) {  
        debugInfoStack = new DebugTraceInfoStack();  
    } else {  
        debugInfoStack = null;  
        }     
    }



意思就是在创建一个ObjectOutputStream的时候,这个ObjectOutputStream流中就已经被写入了一些信息,这些信息会写入到我们的文件中。在第一次写入文件时,这些头部信息时需要的,因为ObjectInputStream读的时候会帮我们过滤掉。但是当我们追加写入一个文件时,这些头部信息也会写入文件中,读取的时候只会把文件第一次出现的头部信息过滤掉,并不会把文件中间的头部信息也过滤掉,这就是问题的根源所在。


解决办法如下:

可以通过继承ObjectOutputStream来覆盖这个方法,如果不是第一次写入文件,这个方法什么也不做。

import java.io.File;  
import java.io.IOException;  
import java.io.ObjectOutputStream;  
import java.io.OutputStream;  
  
/** 
 * 此类继承ObjectOutputStream,重写writeStreamHeader()方法,以实现追加写入时去掉头部信息 
 */  
public class MyObjectOutputStream extends ObjectOutputStream {  
    private static File f;  
  
    // writeStreamHeader()方法是在ObjectOutputStream的构造方法里调用的  
    // 由于覆盖后的writeStreamHeader()方法用到了f。如果直接用此构造方法创建  
    // 一个MyObjectOutputStream对象,那么writeStreamHeader()中的f是空指针  
    // 因为f还没有初始化。所以这里采用单态模式  
    private MyObjectOutputStream(OutputStream out, File f) throws IOException,  
            SecurityException {  
        super(out);  
    }  
  
    // 返回一个MyObjectOutputStream对象,这里保证了new MyObjectOutputStream(out, f)  
    // 之前f已经指向一个File对象  
    public static MyObjectOutputStream newInstance(File file, OutputStream out)  
            throws IOException {  
        f = file;// 本方法最重要的地方:构建文件对象,两个引用指向同一个文件对象  
        return new MyObjectOutputStream(out, f);  
    }  
  
    @Override  
    protected void writeStreamHeader() throws IOException {  
        // 文件不存在或文件为空,此时是第一次写入文件,所以要把头部信息写入。  
        if (!f.exists() || (f.exists() && f.length() == 0)) {  
            super.writeStreamHeader();  
        } else {  
            // 不需要做任何事情  
        }  
    }  
}  


参考:http://blog.csdn.net/touch_2011/article/details/6853871

分享到:
评论

相关推荐

    C# 单文件存放多个序列化对象

    单文件存放多个序列化对象,C#源代码 VS2008

    将类的对象写入文件.rar

    将类的对象写入文件.rar将类的对象写入文件.rar

    html5中如何将图片的绝对路径转换成文件对象

    控件内的每一个用户选择的文件都是一个file对象,而FileList对象则是file对象的列表。代表用户选择的所有文件。我们先来看一个简单的demo,看下file文件对象有哪些属性。如下代码: <!DOCTYPE html> <html&gt...

    axis1 对象传输 多文件传输 javaBean传输 复杂对象传输

    axis1 对象传输 多文件传输 javaBean传输 良心资源 学习axis1的学生少走弯路 ,传输复杂对象时 普通javaBean需要 序列化转换,传流文件时需要类型转换,如有报错可能是mail的jar与javaee的mail冲突。

    VB.NET可以很容易实现多文件多线程同时下载

    用VB6折腾了很久,很难实现多文件同时下载,虽然也说VB6支持异步操作,但是不能真正的多个文件同时下载,也就是说实现不了真正意义上的多线程同时工作,用Inet控件观察了好久,总是一个一个的下载。无奈之下,只好...

    java对象转JSON

    1.一款将java对象转成json或是将json转成java对象的jar文件; 2.在网上找了半天才找到,希望大家共享; 3.使用方法,大家在网上随便找,很多,很简单,一看便会; 4.此包在eclipse中和AndroidStudio中都可以用,但是,你如果...

    前端上传多文件,携带多参数,java接收(省去频繁写一一对应的参数)(csdn)————程序.pdf

    前端上传多文件,携带多参数,java接收(省去频繁写一一对应的参数)(csdn)————程序

    Python Pickle 实现在同一个文件中序列化多个对象

    也是看别人代码才知道可以打开一个文件就可以把多个对象序列化到这个文件中。 with open('../raw_data/remap.pkl', 'wb') as f: pickle.dump(reviews_df, f, pickle.HIGHEST_PROTOCOL) # uid, iid pickle.dump...

    读者-写者问题.cpp

    一个数据文件或者记录可被多个进程(或线程)共享。其中,有些进程(或线程)要求读;而另一些进程(或线程)要求能写或者修改。只要求读的进程(或线程)称为“Reader进程”,其他进程(或线程)称为“Witer进程...

    编辑多个对象_批量编辑

    protel进行编辑多个对象多个关键字请用空格分隔,最多填写5个。点击右侧Tag快速添加

    多个sheet的Excel导入

    此文件为多个sheet的excel导入,可以根据文件后缀,自动适应上传文件的版本,返回为list或者map,支持2003 版本以及2007版本的excel

    jsp九大内置对象

     当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个Session对象,同时分配一个String类型的ID号,JSP引擎同时将这换个ID号发送到客户端,存放在Cookie中,这样Session对象,直到客户关闭浏览器后,...

    1次ajax请求(XMLHttpRequest)上传多个文件,支持进度条处理

    封装了一个ajax多文件上传,功能就是选择多个文件,ajax...调用方式很简单,写一个json对象做为参数配置,设置要上传url以及事件处理函数,new一个AjaxUploadX对象,调用selectFiles方法选择文件,调用uplaod方法上传。

    excel对象清理工具/vba清理Excel对象

    excel多余对象清理工具/Excel瘦身小工具/Excel表格...目前删除几万个还是OK的(测试3-4万个对象处理需要2分钟左右),几十万个就另外手工处理吧,直接卡死。 还有很多不足,还有很多需要改善的地方,请大佬指点指点~

    读者-写者问题.rar

    多个读者和多个写者进程在某个时间段内对该文件资源进行异步操作,也就是说允许多个进程同时读一个共享对象,但不允许一个写进程和其他读进程或写进程同时访问共享对象,因此,所谓"读者--写者问题"就是指必须保证一个写...

    c++读写.ply文件

    本文档介绍了PLY多边形文件格式,用于存储被描述为多边形集合的图形对象的格式。我们的目标是提供一种简单易于实现的格式,但这种格式对于广泛的模型...我们希望这种格式将促进程序之间以及人群之间的图形对象的交换。

    多用户多级目录文件系统的实现

    1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。 2.文件物理结构可采用显式链接或其他方法。 3.磁盘空闲空间的管理可选择位示图或其他方法。如果采用位示图来管理文件...

    Revit房间内对象拷贝插件加载文件

    我开发了一个很小的工具,用来拷贝一个房间内的家具,隔墙,电器,管道,卫生器具等到其它选中的多个房间。 要求把目标房间内需要拷贝的对象做成一个组(Group),如果有些对象不希望拷贝,可以不放入组内。 ...

    vc同时读取多个excel文件&vc操作excel的相关资料

    vc同时读取多个excel文件 vc操作excel的相关资料

    易语言大文件多线程获取MD5源码 GetFileMD5

    线程一:进行读取文件数据到线程队列,线程二:从线程队列中拉取数据进行MD5计算(抄袭了FFMPEG 播放器的 多线程解码的原理),从进度条可以看出几乎读文件线程与计算线程同步,读文件线程首先读出1个数据包 ...

Global site tag (gtag.js) - Google Analytics