JavaIO流之Properties集合

Properties

介绍

Properties基本使用

增删查改

2种遍历 

Properties作为Map集合的特有方法

Properties和IO流相结合的方法

load()方法 

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}
    }
}
posted @ 2022-02-02 03:40  金鳞踏雨  阅读(12)  评论(0编辑  收藏  举报  来源