.properties文件
在 java 程序中,.properties 文件通常作为配置文件存储一些简短又可能很容易改变的信息,比如数据库连接信息等。
这种文件内部是采用键值对的形式存储信息的,通常用空格,=
或者:
来作为分隔符。将一些关键信息存储在 .properties 文件中,相比存在数据库更安全,内部做了更多的限制呗,移植性更高,读取数据效率更高。还可以用来解决国际化问题!
java.util.Properties类
这是 JDK 中提供了一个专门用来操作 .properties 文件的类,自然要设计成键值对的形式,这样可以和 .properties 文件直接映射,避免了无意义的转换,效率更高。所以,Properties 类继承了 java.util.HashTable 类,具有 Map 集合的属性特征,把它当成一个数据结构为键值对的集合看待就可以了,只是它针对 .properties 文件做了一些个性化的功能扩展。
特别要讲到的一点是 java.lang.System 类有一个public Properties getProperties()
方法,它将系统的一些属性以键值对的形式封装到 Properties 对象中去,再将这个对象的引用作为返回值返回。
java.util.Properties 类还有一个public Enumeration propertyNames()
方法,返回一个 Enumeration 对象,用来迭代集合内部的 key 值。这个方法内部是创建了一个 HashTable 对象,来存储 Properties 的键值对,再调用 HashTable 对象的 keys() 方法返回 Enumeration 对象。源码如下:
public Enumeration<?> propertyNames() {
Hashtable<String,Object> h = new Hashtable<>();
enumerate(h);
return h.keys();
}
这个 Enumeration 对象本质是类似于 Iterator 的一个迭代器,是集合对象的一个具有遍历功能的内部类对象。Iterator 是线程不安全的,Enumeration 是线程安全的,线程安全说明做了更多的限制,必然也就导致效率低一点。 Enumeration 类提供了public boolean hasMoreElements()
方法来确定集合内部是否还有元素,以及E nextElement()
方法来获得具体元素的值。迭代器 Iterator 不也是这样的吗?所以说这也是一个迭代器,并不是什么持有对象引用的集合类。
迭代器是如何实现的呢?拿 ArrayList 举例,它有一个私有内部类实现了 Iterator 接口,然后提供一个公有的方法获得 Iterator 对象。这个 Iterator 对象在内存中依赖这个外部 ArrayList 集合对象而存在,内部类对象可以操作到外部类对象的属性,好像一个游标,由此完成迭代器的功能。一两个月前才自己动手实现过的啊,没有做记录,都有点遗忘了,可见记笔记的重要性。学习不做笔记,不做记录等于白读书,白白浪费了时间,毕竟人脑是用来思考的,并不擅长记忆。
java.util.Properties 类还有一个public void list(PrintStream out)
方法可以直接输出到控制台上,参数设置为 System.out 就可以了。
如何读取和写入 .properties 文件?
java.util.Properties 类就是专门设计来对 .properties 文件进行操作的,读取和写入文件是重点内容,当然离不开 IO 流。
读取文件,java.util.Properties 类提供了一个public void load(InputStream inStream) throws IOException
方法,来从指定输入流管道中读取指定文件的内容,并将读到的内容封装到该对象中去。它内部实现就是各种繁杂的 IO 流操作呗!
写入文件,java.util.Properties 类提供了一个public void store(OutputStream out,String comments) throws IOException
方法,来将 Properties 对象的内容通过输出流写入到指定的文件中去,其中第二个属性 comments 是对此 .properties 文件的一个字符串描述信息,在文件中是以 # 标识的注释形式存在的。