zoukankan      html  css  js  c++  java
  • ObjectOutputStream 追加写入读取错误

     本篇博客灵感来自http://blog.csdn.net/chenssy/article/details/13170015

     问题描述、问题出现的原因、尝试解决办法,请参见鄙人上一编博客。

    上一编文章解决ObjectOutputStream 追加写入读取错误问题的方法是自定义了一个ObjectOutputStream子类,我觉得不如用匿名内部类实现方便,于是自我研究写出以下两种方案。个人更推崇方案二

    方案一:

     1 package packa;
     2 
     3 import java.io.*;
     4 
     5 class ObjectInputOutputStream2
     6 {
     7     public static void main(String[] args)throws Exception
     8     {
     9         writeObj();
    10         readObj();
    11     }
    12 
    13     private static void writeObj()throws Exception
    14     {
    15         final File f = new File("person.object");
    16         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.object", true))
    17         {
    18             protected  void writeStreamHeader()throws IOException
    19             {
    20                 if (!f.exists() || (f.exists() && 0 == f.length()))
    21                 {
    22                     super.writeStreamHeader();
    23                 }
    24             }
    25         };
    26 
    27         oos.writeObject(new Person("liu", 30, "kr"));
    28         oos.writeObject(new Person2("liu", "kr", "kr2"));
    29         oos.writeObject(new Person3(10, 30, 50));
    30 
    31         oos.close();
    32     }
    33 
    34     private static void readObj()throws Exception
    35     {
    36         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.object"));
    37 
    38         try
    39         {
    40             while(true)
    41             {
    42                 System.out.println(ois.readObject());    
    43             }
    44         }
    45         catch (Exception e)
    46         {
    47             System.out.println(e.toString());
    48         }
    49 
    50         ois.close();
    51     }
    52 }

    方案二:

     1 package packa;
     2 
     3 import java.io.*;
     4 
     5 class ObjectInputOutputStream
     6 {
     7     public static void main(String[] args)throws Exception
     8     {
     9         writeObj();
    10         readObj();
    11     }
    12 
    13     static ObjectOutputStream  getObjectOutputStreamInstance(final OutputStream os, final File f) throws IOException
    14     {
    15         return  new ObjectOutputStream(os)
    16         {
    17             protected  void writeStreamHeader()throws IOException
    18             {
    19                 if (!f.exists() || (f.exists() && 0 == f.length()))
    20                 {
    21                     super.writeStreamHeader();
    22                 }
    23             }
    24         };
    25     }
    26 
    27     private static void writeObj()throws Exception
    28     {
    29         ObjectOutputStream oos = getObjectOutputStreamInstance(new FileOutputStream("person.object", true), new File("person.object"));
    30         oos.writeObject(new Person("liu", 30, "kr"));
    31         oos.writeObject(new Person2("liu", "kr", "kr2"));
    32         oos.writeObject(new Person3(10, 30, 50));
    33 
    34         oos.close();
    35     }
    36 
    37     private static void readObj()throws Exception
    38     {
    39         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.object"));
    40 
    41         try
    42         {
    43             while(true)
    44             {
    45                 System.out.println(ois.readObject());    
    46             }
    47         }
    48         catch (Exception e)
    49         {
    50             System.out.println(e.toString());
    51         }
    52 
    53         ois.close();
    54     }
    55 }
     1 package packa;
     2 
     3 import java.io.*;
     4 
     5 class Person implements Serializable
     6 {
     7     public static final long serialVersionUID = 44L;
     8 
     9     String name;
    10     transient int age;
    11     static String country = "cn";
    12 
    13     Person(String name, int age, String country)
    14     {
    15         this.name = name;
    16         this.age = age;
    17         this.country = country;
    18     }
    19 
    20     public String toString()
    21     {
    22         return name + " " + age + " " + country;
    23     }
    24 
    25 }
    26 class Person2 implements Serializable
    27 {
    28     public static final long serialVersionUID = 45L;
    29 
    30     String name;
    31     String country;
    32     String country2;
    33 
    34     Person2(String name, String country, String country2)
    35     {
    36         this.name = name;
    37         this.country = country;
    38         this.country2 = country2;
    39     }
    40 
    41     public String toString()
    42     {
    43         return name + " " + country + " " + country2;
    44     }
    45 
    46 }
    47 class Person3 implements Serializable
    48 {
    49     public static final long serialVersionUID = 46L;
    50 
    51     int age;
    52     int age2;
    53     int age3;
    54 
    55     Person3(int age, int age2, int age3)
    56     {
    57         this.age = age;
    58         this.age2 = age2;
    59         this.age3 = age3;
    60     }
    61 
    62     public String toString()
    63     {
    64         return age + " " + age2 + " " + age3;
    65     }
    66 
    67 }
  • 相关阅读:
    【WPF】WPF的二维路径标记语法绘图PathGeometry
    【转】【WPF】WPF无边框窗体
    【转】【数学】矩阵求逆的几何意义
    【转】【数学】矩阵的旋转
    【转】【OPenGL】理解OpenGL拾取模式(OpenGL Picking)
    WPF DataGrid 表头单元格居中DataGridCheckBoxColumn居中单击选中
    Revit 调用自己的窗体,以及导出图纸图片
    OpenXml 学习记录 标签目录 插入文本 表格 图片
    【转】【OpenXML】OpenXML操作word
    【转】【OpenXml】OpenXml操作Word的一些操作总结
  • 原文地址:https://www.cnblogs.com/LiuYanYGZ/p/6115965.html
Copyright © 2011-2022 走看看