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修飾了,序列化時這個屬性就不會序列化了。
同時靜態修飾也不會被序列化,因為序列化是把對象數據進行持久化存儲,而靜態的屬於類加載時的數據,不會被序列化。
java--Properties、序列化流及反序列化流