JavaIO流之Properties集合
Properties
介绍
-
是一个Map体系的集合类
-
Properties可以保存到流中或从流中加载
-
属性列表中的每个键及其对应的值都是一个字符串
Properties基本使用
增删查改
public class Demo {
public static void main(String[] args) {
Properties prop = new Properties();
//增 put
prop.put("小龙女","郭芙");
prop.put("郭靖","黄蓉");
prop.put("黄药师","洪七公");
System.out.println(prop);
//删 remove
prop.remove("小龙女");
System.out.println(prop);
//改 put方法,键不在添加,存在就修改
prop.put("小龙女","杨过");
System.out.println(prop);
//查 get
Object o = prop.get("小龙女");
System.out.println(o);
}
}
2种遍历
(1)使用keySet的方式
public class Demo {
public static void main(String[] args) {
Properties prop = new Properties();
prop.put("小龙女","郭芙");
prop.put("郭靖","黄蓉");
prop.put("黄药师","洪七公");
//遍历方式一 使用ketSet遍历
Set<Object> keys = prop.keySet();
for (Object key : keys) {
Object value = prop.get(key);
System.out.println(key + "=" + value);
//黄药师=洪七公
//郭靖=黄蓉
//小龙女=郭芙
}
}
}
(2)使用entrySet的方式
public class Demo {
public static void main(String[] args) {
Properties prop = new Properties();
prop.put("小龙女","郭芙");
prop.put("郭靖","黄蓉");
prop.put("黄药师","洪七公");
//遍历方式二 使用entrySet遍历
Set<Map.Entry<Object, Object>> entries = prop.entrySet();
for (Map.Entry<Object, Object> entry : entries) {
Object key = entry.getKey();
Object value = entry.getValue();
System.out.println(key + "=" + value);
//黄药师=洪七公
//郭靖=黄蓉
//小龙女=郭芙
}
}
}
注意: Set<Map.Entry<Object, Object>> 里面装的是所有的键值对对象。
Properties作为Map集合的特有方法
常用的只有下面这3个
方法名 | 说明 |
---|---|
Object setProperty(String key, String value) | 设置集合的键和值,都是String类型,底层调用 Hashtable方法 put |
String getProperty(String key) | 使用此属性列表中指定的键搜索属性 |
Set<String> stringPropertyNames() | 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 |
不过这些特有方法都可以被之前的get,put,遍历的方式进行替代。
实例代码
public class Demo {
public static void main(String[] args) {
//创建集合对象
Properties prop = new Properties();
//(1)Object setProperty(String key, String value):设置集合的键和值,都是String类型
prop.setProperty("江苏", "南京");
prop.setProperty("安徽", "南京");
prop.setProperty("山东", "济南");
System.out.println(prop);
//{安徽=南京, 山东=济南, 江苏=南京}
//(2)String getProperty(String key):使用此属性列表中指定的键搜索属性
System.out.println(prop.getProperty("江苏"));
System.out.println(prop.getProperty("安徽"));
//南京
//南京
System.out.println(prop);
//{安徽=南京, 山东=济南, 江苏=南京}
//(3)Set<String> stringPropertyNames():
// 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 --ketSet
Set<String> keys = prop.stringPropertyNames();
for (String key : keys) {
String value = prop.getProperty(key);
System.out.println(key + "..." + value);
//安徽...南京
//江苏...南京
//山东...济南
}
}
}
Properties和IO流相结合的方法
和IO流结合的方法
方法名 | 说明 |
---|---|
void load(Reader reader) | 从输入字符流读取属性列表(键和元素对) |
void store(Writer writer, String comments) | 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流 |
实例代码
假设prop.properties中写的是
username=zhansan
password=123
age=19
garde=6
load()方法
public class Demo {
public static void main(String[] args) throws IOException {
//void load(Reader reader):
//void store(Writer writer, String comments):
Properties prop = new Properties();
FileReader fr = new FileReader("prop.properties");
//调用完了load方法后,文件中的键值对数据已经在集合中了
prop.load(fr);
fr.close();
System.out.println(prop);
//{garde=6, age=19, password=123, username=zhansan}
}
}
store()方法
public class Demo {
public static void main(String[] args) throws IOException {
//void load(Reader reader):
//void store(Writer writer, String comments):
Properties prop = new Properties();
prop.put("zhangsan","123");
prop.put("lisi","456");
prop.put("wangwu","789");
FileWriter fw = new FileWriter("prop.properties");
prop.store(fw,null);
fw.close();
}
}
store方法有两个参数,第一个要传IO流;第二个传注释信息,如果为null,那么就不传。
当然如果不适用load与store方法也可以实现上述的效果,只是更为麻烦。
Properties集合练习
案例需求
在Properties文件中手动写上姓名和年龄,读取到集合中,将该数据封装成学生对象,写到本地文件
实现步骤
-
创建Properties集合,将本地文件中的数据加载到集合中
-
获取集合中的键值对数据,封装到学生对象中
-
创建序列化流对象,将学生对象序列化到本地文件中
代码实现
先创建一个Student类
package IO流;
import java.io.Serializable;
public class Student implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
再将prop.properties文件中手动写入信息
再用测试类进行测试,结果如下,对象信息被写入a.txt中。然后再反序列化将对象信息读入内存中,并打印,代码及结果如下:
package IO流;
import java.io.*;
import java.util.Properties;
public class TestDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1.创建Properties集合,将本地文件中的数据加载到集合中
Properties prop = new Properties();
FileReader fr = new FileReader("prop.properties");
prop.load(fr);
fr.close();
//2.获取集合中的键值对数据,封装到学生对象中
String name = prop.getProperty("name");
int age = Integer.parseInt(prop.getProperty("age"));
Student s = new Student(name,age);
//3.创建序列化流对象,将学生对象序列化到本地文件中
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("a.txt"));
oos.writeObject(s);
oos.close();
//4.再使用反序列化将本地文件中的对象信息读入内存,显示结果
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
Object o = ois.readObject();
System.out.println(o);
ois.close();
//Student{name='lcx', age=18}
}
}