java io流与序列化反序列化

Posted liuoop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java io流与序列化反序列化相关的知识,希望对你有一定的参考价值。

 java的io是实现输入和输出的基础,可以方便的实现数据的输入和输出操作。

技术图片

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

下面是一个实例,通过例子来将以上来简化学习:

技术图片

1.先创建一个学生类来实现serialization

技术图片
 1 package com.etc;
 2 
 3 import java.io.Serializable;
 4 
 5 public class Student implements Serializable
 6     private int id;
 7     private String name;
 8     private char sex;
 9     
10     
11     public Student() 
12         super();
13     
14     public Student(int id, String name, char sex) 
15         super();
16         this.id = id;
17         this.name = name;
18         this.sex = sex;
19     
20     public int getId() 
21         return id;
22     
23     public void setId(int id) 
24         this.id = id;
25     
26     public String getName() 
27         return name;
28     
29     public void setName(String name) 
30         this.name = name;
31     
32     public char getSex() 
33         return sex;
34     
35     public void setSex(char sex) 
36         this.sex = sex;
37     
38 
39     public String show() 
40         return "Student [id=" + id + ", name=" + name + ", sex=" + sex + "]";
41     
42     
43     
44 
View Code

2.通过控制台将建立的学生对象保存到集合中,序列化集合到文件中,在文件反序列化集合,将学生对象添加到学生集合中,遍历集合

 1 package com.etc;
 2 
 3 import java.io.BufferedReader;
 4 import java.io.File;
 5 import java.io.FileOutputStream;
 6 import java.io.IOException;
 7 import java.io.InputStreamReader;
 8 import java.io.ObjectOutputStream;
 9 import java.util.ArrayList;
10 import java.util.List;
11 
12 public class 序列化学生集合 
13     public static void main(String[] args) throws IOException 
14         //创建集合添加学生
15         List<Student> list=new ArrayList<>();
16         //创建控制台输入流,将文件保存到src/student.dat下
17         ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("src/student.dat")));
18         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
19         //获取控制台信息
20         System.out.println("如果录入信息请输入‘y’,否则输入‘n’");
21         String str = br.readLine();
22         boolean flag = true;
23         //循环判断是否继续输入信息
24         while (flag) 
25             Student s = new Student();//实例化一个学生对象
26             //获取各个信息
27             System.out.println("请输入学号");
28             String str1 = br.readLine();
29             System.out.println("请输入姓名");
30             String str2 = br.readLine();
31             System.out.println("请输入性别");
32             String str3 = br.readLine();
33             //将值传入到学生对象中
34             s.setId(Integer.parseInt(str1));
35             s.setName(str2);
36             s.setSex(str3.charAt(0));
37             list.add(s);//添加学生到集合中
38             System.out.println("如果录入信息请输入‘y’,否则输入‘n’");
39             String str8 = br.readLine();
40             //判断是否继续录入
41             if (str8.equals("y")) 
42                 flag = true;
43              else 
44                 flag = false;
45                 System.out.println("录入结束");
46             
47         
48         
49         for (Student student : list) 
50             System.out.println(student.show());
51         
52         oos.writeObject(list);//将信息写入文件中
53         oos.close();
54     
55 

3.反序列化

 1 package com.etc;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.IOException;
 7 import java.io.InputStream;
 8 import java.io.InputStreamReader;
 9 import java.io.ObjectInputStream;
10 import java.util.ArrayList;
11 import java.util.List;
12 
13 public class 反序列化 
14     public static void main(String[] args) throws IOException, ClassNotFoundException 
15         //创建反序列化集合
16         List<Student> arrayList=new ArrayList<>();
17         //读文件
18         ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File("src/student.dat")));
19         //创建集合保存反序列化学生对象
20         ArrayList List=(ArrayList) ois.readObject();
21         
22         //遍历反序列化集合添加到学生集合中
23         for (Object object : List) 
24             arrayList.add((Student) object);
25         
26         //遍历学生集合
27         for (Student student : arrayList) 
28             System.out.println(student.show());
29         
30         
31     
32 

 

反序列化时,一定要想清楚对方传给自己的是什么信息,例如传来的集合,就新建集合,来将反序列化信息来保存,再通过集合的类型,来将传过来的信息进行重组添加到集合中,最后遍历集合。

 

以上是关于java io流与序列化反序列化的主要内容,如果未能解决你的问题,请参考以下文章

IO之序列化流与反序列化流

Java——Properties集合,Object序列化流与反序列化流,打印流,commons-IO文件工具类

Java基础IO类之对象流与序列化

序列化流与反序列化流

java对象序列化与反序列化

序列化流与反序列化流