一個持久的屬性集。Properties能夠保存在流中或從流中加載,Map中每一個鍵和值都對應字符串java
key=value
返回值類型 | 方法 | 描述 |
---|---|---|
void | load(InputStream inStream) | 從輸入流中讀取鍵值對 |
void | load(Reader reader) | 面向格式的對去鍵值對 |
void | store(OutputStream out, String commonts) | 將此Properties表中屬性寫入輸出流 |
void | store(Writer writer, String comments) | 將表中的屬性寫入輸出字符 |
|--Object |--Dirctory<K,V> |--HashTable |--Properties 線程安全的鍵值對集合
Properties pro = new Propertise(); FileReader fr = new FileReader("xxx.propertise"); pro.load(fr); fr,close() System.out.println(pro);
Properties pro = new Properties(); pro.setProperty("key", "value"); FileWriter fw = new FileWriter("xxx.properties"); pro.store(fw, "爲何要寫會數據,不能寫中文") //由於默認的comment的編碼表是Unicode
Properties的做用:mysql
使用ObjectOutputStream實現序列化
使用ObjectInputStream實現反序列化
實現此接口的類才能夠序列化對象
,類都經過實現此接口以達到序列化,而且這個接口沒有方法能夠重寫。序列化的後的對象是看不懂的,這是設計的時候就設計好的,這也是ObjctInputStream存在的意義。sql
凡是接口中沒有任何的方法,只是起一個標記的做用的接口都叫標記型接口。數據庫
|--OutputStream |--ObjectOutputStream |--InputStream |--ObjectInputStream public ObjectOutputStream(OutputStream out) public void writeObject(Object obj) public ObjectInputStream(InputStream in) public void readObjcet(Object obj)
public class Person implements Serializable{ private int age; private String name; public String toString(){ } }
對象的序列化
安全
//建立流對象,封裝文件對象 FileOutputStream fos = new FileOutputStream("person.txt"); //建立對象的序列化輸出流,用ObjectOutputStream的構造方法來輸出 ObjectOutputStream oos = new ObjectOutputStream(fos); Person p = new Person("xxx",25); //調用序列化流的輸出方法將對象寫入文件中 oos.writeObject(p); oos.close();
對象的反序列
服務器
//建立流對象 FileInputStream fis = new FileInputStream("person.txt"); //建立反序列化流 ObjectInputStream ois = new ObjectInputStream(ois); //調用讀取,讀寫的都是Object,因此要強轉回原來的類型 //ClassNotFoundException,要求序列化對象的.class文件必須存在 Object obj = ois.readObject(); System.out.println(obj); ois.close();
因爲靜態的變量是屬於這個類共享數據
,而不屬於對象的私有數據
,因此靜態的變量是不能寫的。可是讀寫的時候這個屬性是使用默認值。編輯器
用來指定對象的某個屬性不作序列化保存編碼
序列號(SerialVersionUId):
實現了Serializable的類在編譯的時候根據類的定義,對類進行了計算產生了一個序列號,而後會將這個序列號寫入ObjectOutputStream流中,在讀取的時候,若是類發生了修改,序列號不同了,就會讀取失敗,拋出InvitalException
。線程
作一個不變的序列號設計
private static final long serialVersionUID = 1234567L;
|--OutputStream |--printStream |--printWriter
連個打印流的方法是徹底一致的,可是通常使用printWriter,區別在與構造器
上。對於打印流來講,構造器就是輸出的目的端
。
public printStream(File file) public printWriter(File file) public printWriter(OutputStream out, boolean autoflush) public printWriter(String s) public printWriter(Writer w) public void println() public void write()
將class文件給用戶作二次開發,將配置文件放在src中
,編輯器會將其存儲在lib文件中,有些維護比較好的是將配置文件放在遠程服務器上,給的jar包中只有一個鏈接。
//properties.properties use="UserName" passward="PassWard" dbPosition="jdbc:mysql://localhost:3306"
FileInputStream fis = new FileInputStream("properties.propertise");
使用類的加載器去讀取配置文件
使用反射機制去拿到類的.class文件,獲得該類的加載器
xxx.class.getClassLoader().getResourceAsStream("propertise.propertise") class拿到對應的類的 getClassLoader()拿到的類的加載文件 getResourceAsStream(String fileName);拿到對應資源文件下的文件