java基礎專欄—Properties

Properties

​ 一個持久的屬性集。Properties能夠保存在流中或從流中加載,Map中每一個鍵和值都對應字符串java

  1. HashTable的子類,Map集合的方法均可以使用,線程安全
  2. 該集合沒有泛型,且不能寫泛型
  3. 它是一個能夠持久換的屬性集。鍵值對均可以存儲到集合中,也能夠存儲到持久換的設備,鍵值的來源均可以是持久化層的設備
  4. 和流對象結合使用表示==持久化存儲==
  5. 必須使用嚴格的書寫規範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集合的存儲

  • public void setProperties(String key, String value)
    • 等同Map中put
  • public String getProperties(String key)
    • 經過鍵獲取值
  • public Set<String> stringPropertyName()
    • 獲取集合中的全部的鍵,相似與Map中的keySet()
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

  1. ==用來寫配置文件,就能夠批量的修改代碼,數據庫等==
  2. 對象的序列化,==以流寫對象存儲==,使用ObjectOutputStream實現序列化
  3. 反序列化,以==流讀取對象==,使用ObjectInputStream實現反序列化

Serializable

​ 實現此接口的類才能夠序列化對象,類都經過實現此接口以達到序列化,而且這個接口沒有方法能夠重寫。序列化的後的對象是看不懂的,這是設計的時候就設計好的,這也是ObjctInputStream存在的意義。sql

標記型接口

​ 凡是接口中沒有任何的方法,只是起一個標記的做用的接口都叫標記型接口。數據庫

ObjectStream—對象的序列化和反序列化

|--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();

靜態不能夠序列化

​ 因爲靜態的變量是屬於這個類共享數據,而不屬於對象的私有數據,因此靜態的變量是不能寫的。可是讀寫的時候這個屬性是使用默認值。編輯器

transient關鍵字

​ 用來指定對象的某個屬性不作序列化保存編碼

序列號衝突問題

序列號(SerialVersionUId):實現了Serializable的類在編譯的時候根據類的定義,對類進行了計算產生了一個序列號,而後會將這個序列號寫入ObjectOutputStream流中,在讀取的時候,若是類發生了修改,序列號不同了,就會讀取失敗,拋出InvitalException線程

自定義序列號

​ 作一個不變的序列號設計

private static final long serialVersionUID = 1234567L;

打印流

  • 不負責數據源,只負責輸出,不關心數據從哪來
  • 爲其餘流添加功能
  • ==永不會拋出IOException,可是可能拋出其餘Exception==
|--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()

AutoFlush

  • 打印的對象必須是OutputStream,Writer
  • 必須調用println,printf,format三個方法中的一個來自動刷新

Properties配置文件

​ 將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);拿到對應資源文件下的文件
相關文章
相關標籤/搜索