序列化实例

package morning;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/*
//老师从控制台录入学员信息,每行数据代表一个学员信息
//具体输入格式是:
//第一次输入
//name:zhangsan;age:34;sex:Male
//第二次
//age:28;name:lisi;sex:FeMale
//第三次
//sex:Male;name:wangwu;age:31

//要求:

//1.将读取的数据放入List<Person>
//2.将List进行序列化到工程下的file/source.txt,并反序列化测试
//3.找到姓名是zhangsan的人,并将所有数据以key-value形式存入file/zhang.properties文件
//4.读取内容,将年龄修改成40并再次写入.properties文件.


分析:
使用的技术点:
标准输入流  System.in
集合-list
字符串切割
序列化/逆序列化  ObjectInputStream/ObjectOutputStream
Properties的使用
File
IO流---FileInputStream  /FileOutputStream
 */
public class Demo1{
    public static void main(String[] args) throws IOException {
        //1,将读取的数据放入List<Person>
        List<Person>  list1 =getData1();

    }

   //1.将读取的数据放入List<Person>
    //第一种:使用字节流直接完成功能
    public static List<Person> getData1() throws IOException{
        List<Person> list = new ArrayList<>();
        /*
        标准输入流:System。in:默认打开,并关联设备键盘
        标准输出流:System。out:默认打开,并关联设备控制台

        输入源:将数据输入键盘---键盘
        输出源:将数据从内存输出---控制台
        */
        //一次接收一行
        InputStream in = System.in;
        System.out.println("请输入数据,每一个用户的数据输入一行:");
        //int num = in.read();//一个阻塞式方法
        StringBuffer stringBuffer  =new StringBuffer();
        while (true){
            int num=in.read();
            if(num=='\r'){
                continue;
            }else if(num=='\n'){//读完一行
                //如果用户输入的是over,直接结束输入
                if(stringBuffer.toString().equals("over")){
                    break;
                }
                list.add(new Person(stringBuffer.toString()));
                //将当前的字符串清空
                stringBuffer.delete(0,stringBuffer.length());
            }else{
                stringBuffer.append((char)num);
            }
        }
        return  list;
    }
    //2.将List进行序列化到工程下的file/source。txt,并反序列化测试
    /*
    序列化:将数据从短期存储转到长期存储(从内存到磁盘)
    逆序列化:将数据从长期存储转到短期存储(从磁盘到内存)

    //次场景中使用最多的是将对象进行序列化
    注意点:
    1:作为元素的类必须实现Serializable接口,实现了就意味着当前的类可以被序列化。
    2:必须使用ObjectInputstream和ObjectOutputStream流配合普通的能够进行读写的流.
    3:如果是将一个集合进行序列化,我们要保证集合 自身和所有元素都实现了Serializable接口

    */
    //序列化
    public  static void writeList(List<Person> list) throws IOException{
        ObjectOutputStream outputStream  =new ObjectOutputStream(new FileOutputStream(getUrl("source.txt")));
        outputStream.writeObject(list);
        outputStream.close();
    }

    //反序列化
    public static List<Person> readList() throws IOException,ClassNotFoundException{
        ObjectInputStream objectInputStream  = new ObjectInputStream(new FileInputStream(getUrl("source")));
        return  (List<Person>)objectInputStream.readObject();
    }


//创建file目录
    public  static String getUrl(String fileName){
        String url="C:\\Users\\Administrator\\Desktop\\files";
        File file = new File(url);
        if(!file.exists()){
            file.mkdir();
        }
        return url+"\\"+fileName;
    }

    static enum Gender{
        Male,Female
    }

    static class  Person implements Serializable {
        private String name ;
        private Gender sex;
        private  int age;

        public Person(String line){
            //字符串切割
            //name:zhangsan;age:34:sex:Male
            //使用;切第一刀
            String [] strings  =line.split(";");
            for(String string : strings){
                //使用:切第二刀
                String[] pair  =string.split(":");
                String key = pair[0];
                String value = pair[1];
                if(key.equals("name")){
                    this.name = value;
                }else if(key.matches("sex")){
                    if(value.equals("Male")){
                        this.sex  =Gender.Male;
                    }else{
                        this.sex  =Gender.Female;
                    }
                }else if(key.matches("age")){
                    this.age = Integer.parseInt(value);
                }
            }
        }

        public Person(){}

        public Person(String name, Gender sex, int age) {
            this.name = name;
            this.sex = sex;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Gender getSex() {
            return sex;
        }

        public void setSex(Gender sex) {
            this.sex = sex;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", sex=" + sex +
                    ", age=" + age +
                    '}';
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值