java 使用对象输出流ObjectOutputStream对文件追加对象注意

来源:互联网 发布:shake it offmp3在线 编辑:程序博客网 时间:2024/06/04 23:35

在使用java来存储对象是很简单的,但是需要追加对象时为了方便在能使用ObjectInputStream读取所有对象时(包括追加的对象),就需要要做些特别的处理。

首先能追加数据,那么在构造FileOutPutStream时注意。


FileOutputStream(File file, boolean append) 
          创建一个向指定 File 对象表示的文件中写入数据的文件输出流

    创建一个向指定 File 对象表示的文件中写入数据的文件输出流。如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。创建一个新 FileDescriptor 对象来表示此文件连接。


其次为了能保证追加的对象被读取到,那么需要自己去新建一个对象输出流,并继承ObjectInputStream,并重写

protected void writeStreamHeader()                          throws IOException
提供 writeStreamHeader 方法,这样子类可以将其自身的头部添加或预加到流中。它可以将幻数 (magic number) 和版本写入流。

如下代码网上参考的:

class ObjectOutputStreamForAddObject extendsObjectOutputStream {    private static File f; writeStreamHeader()方法是在ObjectOutputStream的构造方法里调用的由于覆盖后的writeStreamHeader()方法用到了f。如果直接用构造方法创建一个MyObjectOutputStream对象,那么writeStreamHeader()中的f是空指针因为f还没有初始化。所以这里采用单态模式(将构造方法定义为私有的,然后通过方法获取对象,可以保证某个类只能存在一个对象示例)     public static  ObjectOutputStreamForAddObject newInstance(File file,OutputStream out)             throws IOException {        f = file;        return new ObjectOutputStreamForAddObject(out);}     private ObjectOutputStreamForAddObject(OutputStream out) throws IOException{        super(out);    }     @Override    protected void writeStreamHeader() throws IOException {        if (!f.exists() || (f.exists() &&f.length() == 0)) {             super.writeStreamHeader();        } else {             super.reset();        }    }}
最后 在将对象写入文件的时候是调用ObjectOutputStreamForAddObject类,记得调用flush(),close()方法哦。

以上才能保证追加对象不会出错。



0 0
原创粉丝点击