一个持久的属性集。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);拿到对应资源文件下的文件