1. 程式人生 > >java--Properties、序列化流及反序列化流

java--Properties、序列化流及反序列化流

ble his 持久化存儲 table dex this bubuko 描述符 信息

一、 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修飾了,序列化時這個屬性就不會序列化了。

同時靜態修飾也不會被序列化,因為序列化是把對象數據進行持久化存儲,而靜態的屬於類加載時的數據,不會被序列化。

java--Properties、序列化流及反序列化流