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);拿到对应资源文件下的文件
相关文章
相关标签/搜索