您的位置:首页 > 移动开发 > Objective-C

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

2014-06-09 22:43 381 查看
在使用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()方法哦。
以上才能保证追加对象不会出错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐