• Java里的IO流里的 ObjectInputStream 的读取写入!


    各位好!!我又来了!!今天遇见了一个小问题!!

    IO流里的对象读取总是出错!各种报错!!神烦啊!!百思不得其解啊!然后就上网百度!找了好久终于让我找到了!下面就让我来说一说!

    当你用IO流里的对象流写入的时候,ObjectOutputStream会在文件中的开头和结尾进行一个标识AC/DC,ObjectInputStream会严格的根据开头和结尾来进行读取,当读取不到的时候就会进行报错!!

    ObjectOutputStream无法将上一次的对象的结尾的DC消除,所以千万不要用FileOutPutStream(“文件地址”,true)来添加;

    当想要向文件中再次添加对象的时候,必须先进行读取文件中的对象并添加在集合中完毕后并关闭资源,然后遍历集合进行添加对象完毕并关闭资源!-----》先读取后添加!

    代码中的注意点有一点是橘色的,这个很重要!当进行close的时候结尾(DC)也会随之而添加上!

    我这个人比较倾向于实战!可以直接将我的代码复制到各位的eclipse中或其他的什么!代码中有详细的解释和一些被我注释掉的代码!那些也是正确可以运行的!各位也可以进行比较一下哪种方法好!

    如果有错误的话,请指正!!!

      1 import java.io.EOFException;
      2 import java.io.FileInputStream;
      3 import java.io.FileNotFoundException;
      4 import java.io.FileOutputStream;
      5 import java.io.IOException;
      6 import java.io.ObjectInputStream;
      7 import java.io.ObjectOutputStream;
      8 import java.io.Serializable;
      9 import java.util.ArrayList;
     10 //想要序列化对象必须接口Serializable,否则不能被序列化
     11 class Car implements Serializable{
     12 
     13     /**
     14      * 给对象添加一个唯一的ID,便于以后增删成员变量!
     15      */
     16     private static final long serialVersionUID = 1L;
     17     String brand;
     18     transient String owner;//添加transient  防止此成员变量被泄露!
     19     public Car(String brand,String owner){
     20         this.brand = brand;
     21         this.owner = owner;
     22     }
     23     
     24 }
     25 
     26 public class ObjectOutAndIn {
     27 
     28     /**
     29      * @param args
     30      */
     31     public static void main(String[] args) {
     32         // TODO Auto-generated method stub
     33         /**
     34          * ********写入方法**********
     35          */
     36         /*(1)*///writerIn();
     37         /**
     38          * ********读取方法**********
     39          */
     40         /*(2)*///readerOut();
     41         /**
     42          * ****读取/写入多个对象的方法****
     43          * 建议将步骤一和二注释掉!
     44          */
     45         /*(3)*/writerInAndreaderOut();
     46     }
     47     
     48     public static void writerInAndreaderOut(){
     49         /**
     50          * 当想写入多个对象时,有两种方法!
     51          * 方法一:(1)创建一个集合将对象添加进该集合,然后将集合的对象写入文件中;
     52          *           (2)等到用的时候直接读取集合对象,从集合中获取对象
     53          * 方法二:(1)创建一个集合将对象添加进该集合,然后遍历集合对象
     54          *            (2)用同一个对象写入流来写入对象
     55          * 对象写入注意:(1)当写入对象的时候,对象写入流会在开头和结尾添加AC/DC
     56          *                 (2)必须用同一个对象写入流写入,因为在对象写入流close的时候会添加DC
     57          *                 ,再次写入另外一些对象的时候DC也不会消失,所以当读取的时候就会出现错误!
     58          *                 (3)以上是我自己的见解,如果出错的话请留言各位!!
     59          */
     60         
     61         //创建一个集合对象
     62         ArrayList<Car> arr = new ArrayList<Car>();
     63         arr.add(new Car("兰博基尼", "刘能"));
     64         arr.add(new Car("劳斯莱斯", "赵四"));
     65         
     66         /**
     67          * 方式一:
     68          */
     69         /**
     70          * 写入集合对象
     71          */
     72         /*try {
     73             //创建一个写入通道
     74             FileOutputStream out = new FileOutputStream("C:\Users\wang\Desktop\ArrayList.txt");
     75             try {
     76                 //创建一个对象写入通达!
     77                 ObjectOutputStream objOut = new ObjectOutputStream(out);
     78                 //开始写入集合对象
     79                 objOut.writeObject(arr);
     80                 //关闭写入资源
     81                 objOut.close();
     82             } catch (IOException e) {
     83                 // TODO Auto-generated catch block
     84                 e.printStackTrace();
     85             }
     86         } catch (FileNotFoundException e) {
     87             // TODO Auto-generated catch block
     88             e.printStackTrace();
     89         }*/
     90         /**
     91          * 读取集合对象
     92          */
     93         /*try {
     94             //创建一个写入通道
     95             FileInputStream in = new FileInputStream("C:\Users\wang\Desktop\ArrayList.txt");
     96             try {
     97                 //创建一个对象读取通达!
     98                 ObjectInputStream objIn = new ObjectInputStream(in);
     99                 try {
    100                     //读取对象,返回的是一个Object类型的对象(需强转)
    101                     ArrayList<Car> readArray = (ArrayList<Car>)objIn.readObject();
    102                     //遍历读取到的readAraay集合!
    103                     for(Car c:readArray){
    104                         System.out.println(c.brand+c.owner);
    105                     }
    106                     //关闭读取资源
    107                     objIn.close();
    108                 } catch (ClassNotFoundException e) {
    109                     // TODO Auto-generated catch block
    110                     e.printStackTrace();
    111                 }
    112             } catch (IOException e) {
    113                 // TODO Auto-generated catch block
    114                 e.printStackTrace();
    115             }
    116             
    117         } catch (FileNotFoundException e) {
    118             // TODO Auto-generated catch block
    119             e.printStackTrace();
    120         }*/
    121         
    122         /**
    123          * 方式二:
    124          */
    125         /**
    126          * 写入集合对象
    127          */
    128         /*try {
    129             //创建一个写入通道
    130             FileOutputStream out = new FileOutputStream("C:\Users\wang\Desktop\ArrayList.txt");
    131             try {
    132                 //创建一个对象写入通达!
    133                 ObjectOutputStream objOut = new ObjectOutputStream(out);
    134                 //利用for循环来写入Car对象!
    135                 for(Car c:arr){
    136                     objOut.writeObject(c);
    137                 }
    138                 //关闭写入资源!
    139                 objOut.close();
    140             } catch (IOException e) {
    141                 // TODO Auto-generated catch block
    142                 e.printStackTrace();
    143             }
    144         } catch (FileNotFoundException e) {
    145             // TODO Auto-generated catch block
    146             e.printStackTrace();
    147         }*/
    148         /**
    149          * 读取集合对象
    150          */
    151         try {
    152             //创建一个写入通道
    153             FileInputStream in = new FileInputStream("C:\Users\wang\Desktop\ArrayList.txt");
    154             try {
    155                 //创建一个对象读取通达!
    156                 ObjectInputStream objIn = new ObjectInputStream(in);
    157                 try {
    158                     try {
    159                         //while循环读取对象并打印!
    160                         while(true){
    161                             Car c = (Car)objIn.readObject();
    162                             System.out.println(c.brand+c.owner);
    163                         }
    164                     } catch (ClassNotFoundException e) {
    165                         // TODO Auto-generated catch block
    166                         e.printStackTrace();
    167                     }
    168                 } catch (EOFException e) {
    169                     //当while循环完毕后会爆出---》 java.io.EOFException》代表打印完毕!
    170                     System.out.println("打印完毕!!");
    171                 }finally{
    172                     //关闭读取资源
    173                     objIn.close();
    174                 }
    175             } catch (IOException e) {
    176                 // TODO Auto-generated catch block
    177                 e.printStackTrace();
    178             }
    179             
    180         } catch (FileNotFoundException e) {
    181             // TODO Auto-generated catch block
    182             e.printStackTrace();
    183         }
    184     }
    185     
    186     public static void readerOut(){
    187         try {
    188             //创建一个写出通道
    189             FileInputStream in = new FileInputStream("C:\Users\wang\Desktop\List.txt");
    190             try {
    191                 //创建一个写出对象的通道!
    192                 ObjectInputStream objIn = new ObjectInputStream(in);
    193                 try {
    194                     //读取对象,返回的是一个Object类型的对象(需强转)
    195                     Car car = (Car)objIn.readObject();
    196                     //打印一下,看是否是步骤一写入的对象!---->由于owner是被transient修饰的所以显示为null
    197                     System.out.println(car.brand + car.owner);
    198                 } catch (ClassNotFoundException e) {
    199                     // TODO Auto-generated catch block
    200                     e.printStackTrace();
    201                 }
    202             } catch (IOException e) {
    203                 // TODO Auto-generated catch block
    204                 e.printStackTrace();
    205             }
    206         } catch (FileNotFoundException e) {
    207             // TODO Auto-generated catch block
    208             e.printStackTrace();
    209         }
    210     }
    211     
    212     public static void writerIn(){
    213                 try {
    214                     //创建一个写入通道!
    215                     FileOutputStream out = new FileOutputStream("C:\Users\wang\Desktop\List.txt");
    216                     try {
    217                         //创建一个写入对象的通道!
    218                         ObjectOutputStream objOut = new ObjectOutputStream(out);
    219                         //创建一个对象
    220                         Car car = new Car("奔驰", "张三");
    221                         //写入对象
    222                         objOut.writeObject(car);
    223                         //关闭写入资源
    224                         objOut.close();
    225                         /**
    226                          * ********在此时写入完成!********
    227                          */
    228                     } catch (IOException e) {
    229                         // TODO Auto-generated catch block
    230                         e.printStackTrace();
    231                     }
    232                 } catch (FileNotFoundException e) {
    233                     // TODO Auto-generated catch block
    234                     e.printStackTrace();
    235                 }
    236     }
    237 
    238 }

    在接下来的代码中可以读取/写入---->覆盖原有对象并添加新对象!

      1 public static void writerInOrReaderOut(){
      2         
      3         ArrayList<Car> arr = new ArrayList<Car>();
      4         try {
      5             //创建读取的通道
      6             FileInputStream in = new FileInputStream("C:\Users\wang\Desktop\ArrayList.txt");
      7             try {
      8                 //创建对象读取通道!
      9                 ObjectInputStream objIn = new ObjectInputStream(in);
     10                 try {
     11                     try {
     12                         //开始读取 
     13                         while(true){    
     14                             try {
     15                                 Car c = (Car) objIn.readObject();
     16                                 //向集合中添加对象
     17                                 arr.add(c);
     18                             } catch (ClassNotFoundException e) {
     19                                 // TODO Auto-generated catch block
     20                                 e.printStackTrace();
     21                             }
     22                             
     23                         }
     24                     } catch (EOFException e) {
     25                         // TODO Auto-generated catch block
     26                         System.out.println("添加完了!");
     27                     }
     28                 }finally{
     29                     objIn.close();
     30                 }
     31                 
     32             } catch (IOException e) {
     33                 // TODO Auto-generated catch block
     34                 e.printStackTrace();
     35             }
     36         } catch (FileNotFoundException e) {
     37             // TODO Auto-generated catch block
     38             e.printStackTrace();
     39         }
     40         try {
     41             //创建输出通道!
     42             FileOutputStream out = new FileOutputStream("C:\Users\wang\Desktop\ArrayList.txt");
     43             try {
     44                 //创建对象输出通道!
     45                 ObjectOutputStream objOut = new ObjectOutputStream(out);
     46                 //for循环遍历
     47                 for(Car c:arr){
     48                     objOut.writeObject(c);
     49                 }
     50                 //在这里添加某个对象
     51                 objOut.writeObject(new Car("兰博基尼", "纷纷"));
     52                 //关闭资源
     53                 objOut.close();
     54             } catch (IOException e) {
     55                 // TODO Auto-generated catch block
     56                 e.printStackTrace();
     57             }
     58         } catch (FileNotFoundException e) {
     59             // TODO Auto-generated catch block
     60             e.printStackTrace();
     61         }
     62         
     63         try {
     64             //创建读取的通道
     65             FileInputStream in = new FileInputStream("C:\Users\wang\Desktop\ArrayList.txt");
     66             try {
     67                 //创建对象读取通道!
     68                 ObjectInputStream objIn = new ObjectInputStream(in);
     69                 try {
     70                     try {
     71                         //开始读取 
     72                         while(true){    
     73                             try {
     74                                 //读取对象!
     75                                 Car c = (Car) objIn.readObject();
     76                                 //打印对象!
     77                                 System.out.println(c.brand+c.owner);
     78                             } catch (ClassNotFoundException e) {
     79                                 // TODO Auto-generated catch block
     80                                 e.printStackTrace();
     81                             }    
     82                         }
     83                     } catch (EOFException e) {
     84                         // TODO Auto-generated catch block
     85                         System.out.println("打印完了!");
     86                     }
     87                 }finally{
     88                     //关闭资源!
     89                     objIn.close();
     90                 }
     91                 
     92             } catch (IOException e) {
     93                 // TODO Auto-generated catch block
     94                 e.printStackTrace();
     95             }
     96         } catch (FileNotFoundException e) {
     97             // TODO Auto-generated catch block
     98             e.printStackTrace();
     99         }
    100         
    101         
    102     }
  • 相关阅读:
    [ASP.NET Core 3框架揭秘] Options[6]: 扩展与定制
    [ASP.NET Core 3框架揭秘] Options[5]: 依赖注入
    [ASP.NET Core 3框架揭秘] Options[4]: Options模型[下篇]
    [ASP.NET Core 3框架揭秘] Options[3]: Options模型[上篇]
    [ASP.NET Core 3框架揭秘] Options[2]: 配置选项的正确使用方式[下篇]
    [ASP.NET Core 3框架揭秘] Options[1]: 配置选项的正确使用方式[上篇]
    [ASP.NET Core 3框架揭秘] 配置[9]:自定义配置源
    ASP.NET Core 3框架揭秘] 配置[8]:多样化的配置源[下篇]
    [ASP.NET Core 3框架揭秘] 配置[7]:多样化的配置源[中篇]
    [ASP.NET Core 3框架揭秘] 配置[6]:多样化的配置源[上篇]
  • 原文地址:https://www.cnblogs.com/a710445786/p/6145553.html
Copyright © 2020-2023  润新知