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个字节的头部。
2、重写ObjectOutputStream 的 writeStreamHeader()方法。自定义追加写入对象的类
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()); }
相关文章推荐
- 通过ObjectOutputStream向一个文件中多次以追加方式写入object的解决方案
- OutputStream 写入文件(追加方式)
- 每日一c 追加方式 写入文件FILE *fp
- 关于ObjectOutputStream在文件末尾追加的问题
- PHP以追加方式写入文件 file_put_content
- IO流-ObjectOutputStream-将对象写入到文件中
- java 序列化ObjectOutputStream 同一文件追加写对象问题的解决
- Android 追加和覆盖两种方式将byte[]写入文件
- java如何对文件追加写入【new FileOutputStream(file, true)】
- 追加写入的方式的 写 csv文件
- JAVA如何以追加的方式向文件中写入信息?
- JAVA如何以追加的方式向文件中写入信息
- ObjectOutputStream 追加写入读取错误
- 以追加方式写入文件的几种方法
- 以追加方式写入文件的几种方法
- JAVA如何以追加的方式向文件中写入信息?
- ObjectOutputStream 追加写入读取错误
- CSV写入文件追加新的内容,文件编码处理
- PHP 文件写入或追加数据
- java写入文件(文件内容末尾追加)