zoukankan      html  css  js  c++  java
  • java--Properties、序列化流及反序列化流

    一、 Properties类

    1、 Properties类介绍

    Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

    特点:

    (1)、Hashtable的子类,map集合中的方法都可以用。

    (2)、该集合没有泛型。键值都是字符串。

    (3)、它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。

    (4)、有和流技术相结合的方法。

    2、常用方法

     load(InputStream)  把指定流所对应的文件中的数据,读取出来,保存到Propertie集合中

     load(Reader)  

     store(OutputStream,commonts)把集合中的数据,保存到指定的流所对应的文件中,参数commonts代表对描述信息

     stroe(Writer,comments);

    代码实现:

     1     Properties pro=new Properties();
     2     //存数据
     3     pro.setProperty("driver", "com.mysql.jdbc.driver");
     4     pro.setProperty("uesername", "root");
     5     pro.setProperty("password", "123456");
     6     //取数据
     7     //获取键的集合
     8     Set<String> set=pro.stringPropertyNames();
     9         //通过键找值
    10     for(String s:set){
    11         System.out.println(s+"..."+pro.getProperty(s));
    12     }

    从properties文件中读取键值对--代码实现:

     1 public static void method1() throws IOException{
     2         //从properties文件中读取键值对
     3         Properties pro=new Properties();
     4         //明确数据源
     5         FileInputStream fis=new FileInputStream("e:\test\demo1.properties");
     7         pro.load(fis);
     8         fis.close();
     9         //遍历
    10         Set<String> set=pro.stringPropertyNames();
    11         for(String s:set){
    12             System.out.println(s+"..."+pro.getProperty(s));
    13         }
    14     }    

    通过properties集合向properties文件中写键值对--代码实现:

     1 public static void method2() throws IOException{
     2         //通过properties向文件中写键值对
     3         //明确目的地
     4         FileOutputStream fos=newFileOutputStream("e:\test\demo2.properties");
     6         Properties pro=new Properties();
     7         pro.setProperty("name", "baba");
     8         pro.setProperty("age", "85");
     9         pro.store(fos, "你好");//“你好”是注释可写可不写
    10     }

    二、序列化流与反序列化流

    用于从流中读取对象的操作流 ObjectInputStream    称为 反序列化流

    用于向流中写入对象的操作流 ObjectOutputStream   称为 序列化流

    特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。

    1.对象序列化流ObjectOutputStream

    person类:

     1 package com.oracle.Properties;
     2 
     3 import java.io.Serializable;
     4 
     5 public class Person implements Serializable{
     6     private String name;
     7     private transient int age;//瞬态关键字--序列化时这个属性就不会序列化了
     8     //定义序列号(定死)
     9     private static final long serialVersionUID=123456789L; 
    10     public Person(String name, int age) {
    11         super();
    12         this.name = name;
    13         this.age = age;
    14     }
    15     
    16     public String getName() {
    17         return name;
    18     }
    19     public void setName(String name) {
    20         this.name = name;
    21     }
    22     public int getAge() {
    23         return age;
    24     }
    25     public void setAge(int age) {
    26         this.age = age;
    27     }
    28     @Override
    29     public String toString() {
    30         return "Person [name=" + name + ", age=" + age + "]";
    31     }
    32 }

    测试类:

     1 public static void method3() throws IOException{
     2         Person p=new Person("张三", 18);
     3         //明确目的地
     4         FileOutputStream fos=new FileOutputStream("e:\test\person.txt");
     5         //创建序列化流
     6         ObjectOutputStream oos=new ObjectOutputStream(fos);
     7         //写入对象
     8         oos.writeObject(p);
     9         //释放资源
    10         oos.close();    
    11     }

    2.对象反序列化流ObjectInputStream

    测试类:

     1   //反序列化
     2     public static void method4() throws IOException, ClassNotFoundException{
     3         //明确数据源
     4         FileInputStream fis=new FileInputStream("e:\test\person.txt");
     5         //创建反序列化对象
     6         ObjectInputStream ois=new ObjectInputStream(fis);
     7         //反序列化
     8         Person p=(Person)ois.readObject();
     9         System.out.println(p);
    10     }

    3.序列化接口

    特点:

    1.当一个对象要能被序列化,这个对象所属的类必须实现Serializable接口。(否则会发生异常NotSerializableException异常。

    2.当反序列化对象时,如果对象所属的class文件在序列化之后进行的修改,那么进行反序列化也会发生异常InvalidClassException。发生这个异常的原因如下:

    (1)该类的序列版本号与从流中读取的类描述符的版本号不匹配

    (2)该类包含未知数据类型

     

    (3)该类没有可访问的无参数构造方法

     

    3.Serializable标记接口。该接口给需要序列化的类,提供了一个序列版本号。serialVersionUID. 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。

     

    4.瞬态关键字transient

    当一个类的对象需要被序列化时,某些属性不需要被序列化,这时不需要序列化的属性可以使用关键字transient修饰。只要被transient修饰了,序列化时这个属性就不会序列化了。

    同时静态修饰也不会被序列化,因为序列化是把对象数据进行持久化存储,而静态的属于类加载时的数据,不会被序列化。

  • 相关阅读:
    1509 加长棒
    51Nod 1158 全是1的最大子矩阵
    P2953 [USACO09OPEN]牛的数字游戏Cow Digit Game
    P3384 【模板】树链剖分
    北京集训DAY3
    北京集训DAY2
    北京集训DAY1
    51Nod 1422 沙拉酱前缀 二分查找
    51Nod 1109 01组成的N的倍数
    51Nod 1043 幸运号码 数位DP
  • 原文地址:https://www.cnblogs.com/-dashu/p/9541245.html
Copyright © 2011-2022 走看看