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

ObjectOutputStream以追加方式写入文件

2014-04-14 19:44 330 查看
不知道大家有没有遇到这样的异常 java.io.StreamCorruptedException: invalid type code: AC ,我在用ObjectOutputStream以追加的方式往文件里面写入,在写入时打开一个流,用writeObject()写入对象后关闭流,然后又打开流,再追加写入对象。这样在用ObjectInputStream读取对象时,就会报这个异常,第一个对象是可以正常读出来,第二各对象就报异常了。原因是在新建一个ObjectOutputStream对象时会首先在写入两个Short类型的数据,就是四个字节,可以去看看ObjectOutputStream的构造方法,里面调用了一个writeStreamHeader()方法,在这个方法中写入了两个Short类型的头部数据。所以要解决这个问题就有两个办法:

1、在用readObject()读对象的时候,先去掉4个字节的头部。

public static void main(String[] args) throws Exception {
		File file =new File("/home/zhang/test/test.txt");
			FileOutputStream fos = new FileOutputStream(file,true);
			ObjectOutputStream oos = new ObjectOutputStream(fos);
			oos.writeObject(new User("aaa","123")); //写入第一个对象
			oos.close();//关闭流
			
			FileOutputStream fos1 = new FileOutputStream(file,true);
			ObjectOutputStream oos1 = new ObjectOutputStream(fos1);
			oos1.writeObject(new User("bbb","123"));//写入第二个对象
			oos1.close();
			
			FileInputStream fis = new FileInputStream(file);
			ObjectInputStream ois = new ObjectInputStream(fis);
			User user=(User)ois.readObject();
			System.out.println(user.toString());//读取第一个对象
			
			byte[] buf =new byte[4];
			fis.read(buf);
			user=(User)ois.readObject();   //读取第二个对象
			System.out.println(user.toString());
	}
这样在读第二个对象是时就不会抛出异常了。

2、重写ObjectOutputStream 的 writeStreamHeader()方法。自定义追加写入对象的类

public class AppendObjectOutputStream extends ObjectOutputStream {

	public static  File file = null;   //总觉的在这里把这个file定义成公有静态不好,
	                                    //但是这个变量必须在构造之前被初始化。只好这么办了
	
	public AppendObjectOutputStream(File file) throws IOException {
		super(new FileOutputStream(file,true));
	}
	public void writeStreamHeader() throws IOException {
				
		System.out.println("重写的方法执行了");
		if (file != null) {
			System.out.println("file.length()="+file.length());
			if (file.length() == 0) {
			System.out.println("文件存在但为空!!!");
				super.writeStreamHeader();
			} else {
				System.out.println("文件不为空");  //当文件不为空时,空实现
			}
		} else {
			System.out.println("文件不存在");
			super.writeStreamHeader();
		}
	}
}


public static void main(String[] args) throws Exception {
		File file =new File("/home/zhang/test/test.txt");
		    AppendObjectOutputStream.file = file;  //必须先给file赋值,不然后面重写的方法里的判断都不会进入了
		    AppendObjectOutputStream aoos = new AppendObjectOutputStream(file);
			aoos.writeObject(new User("aaa","123")); //写入第一个对象
			aoos.close();//关闭流
			
			AppendObjectOutputStream aoos1 = new AppendObjectOutputStream(file);
			aoos1.writeObject(new User("bbb","123"));//写入第二个对象
			aoos1.close();
			
			FileInputStream fis = new FileInputStream(file);
			ObjectInputStream ois = new ObjectInputStream(fis);
			User user=(User)ois.readObject();
			System.out.println(user.toString());//读取第一个对象
			user=(User)ois.readObject();   //读取第二个对象
			System.out.println(user.toString());
	}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: