您的位置:首页 > 编程语言 > Java开发

java基础专栏—Properties

2017-10-21 00:00 204 查看
摘要: 笔者在java学习的这条道路上也是断断续续走了一年多了,视频啊,书籍啊什么的也看了好几遍了,真的是java从入门到放弃啊,哈哈,看的多了一渐渐的明白了一点东西,笔者整理了一些自己的学习笔记,在此与大家分享,不喜勿喷,多多指教,万分感谢。

Properties

​ 一个持久的属性集。Properties可以保存在流中或从流中加载,Map中每个键和值都对应字符串

HashTable的子类,Map集合的方法都可以使用,线程安全

该集合没有泛型,且不能写泛型

它是一个可以持久换的属性集。键值对都可以存储到集合中,也可以存储到持久换的设备,键值的来源都可以是持久化层的设备

和流对象结合使用表示==持久化存储==

必须使用严格的书写规范
key=value


返回值类型方法描述
voidload(InputStream inStream)从输入流中读取键值对
voidload(Reader reader)面向格式的对去键值对
voidstore(OutputStream out, String commonts)将此Properties表中属性写入输出流
voidstore(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的作用:

==用来写配置文件,就可以批量的修改代码,数据库等==

对象的序列化,==以流写对象存储==,
使用ObjectOutputStream实现序列化


反序列化,以==流读取对象==,
使用ObjectInputStream实现反序列化


Serializable

​ 实现此接口的类才可以
序列化对象
,类都通过实现此接口以达到序列化,并且这个接口没有方法可以重写。序列化的后的对象是看不懂的,这是设计的时候就设计好的,这也是ObjctInputStream存在的意义。

标记型接口

​ 凡是接口中没有任何的方法,只是起一个标记的作用的接口都叫标记型接口。

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);拿到对应资源文件下的文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java properties