1. Properties

1.1. Properties作为Map集合的使用

1.1.1. 介绍

  • Properties是一个Map体系的集合类
  • Properties可以保存到流中或从流中加载
  • 属性列表中的每个键及其对应的值都是一个字符串

1.1.2. 基本使用

public static void main(String[] args) {
    Properties prop = new Properties();
    //增
    prop.put("小龙女", "尹志平");
    prop.put("郭襄", "杨过");
    prop.put("黄蓉", "欧阳克");
    System.out.println(prop);
​
​
    //删
    //prop.remove("郭襄");
    //System.out.println(prop);
​
    //改
    //put --- 如果键不存在,那么就添加,如果键存在,那么就覆盖.
    prop.put("小龙女", "杨过");
    System.out.println(prop);
    //查
​
    //Object value = prop.get("黄蓉");
    //System.out.println(value);
​
    //遍历
    Set<Object> keys = prop.keySet();
    for (Object key : keys) {
        Object value = prop.get(key);
        System.out.println(key + "=" + value);
    }
​
    System.out.println("========================");
​
    //装的是所有的键值对对象.
    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);
    }
​
}

1.1.3. Properties作为Map集合的特有方法

方法名 说明
Object setProperty(String key, String value) 设置集合的键和值,都是String类型,底层调用 Hashtable方法 put
String getProperty(String key) 使用此属性列表中指定的键搜索属性
Set\ stringPropertyNames() 从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串

1.1.4. 代码

    public static void main(String[] args) {
        Properties prop = new Properties();
​
        // 设置属性
        prop.setProperty("username", "zhangsan");
        prop.setProperty("age", "17");
        prop.setProperty("gender", "nan");
        System.out.println(prop);
​
​
        // 获取属性值
        System.out.println(prop.getProperty("username"));
​
        // prop.remove("username");
​
        //获取所有的属性名(就是所有的key)  keySet
        Set propertyNames = prop.stringPropertyNames();
        System.out.println(propertyNames);
​
    }

1.2. Properties和IO流相结合的方法

方法名 说明
void load(Reader reader) 从输入字符流读取属性列表(键和元素对)
void store(Writer writer, String comments) 将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式写入输出字符流

1.2.1. 代码1 Properties结合BufferedWriter存数据

  • 保存的文件名字 一般以.properties为后缀

    public class Demo03 {
       public static void main(String[] args) throws IOException {


           Properties prop = new Properties();

           prop.setProperty("001", "xiaoming");
           prop.setProperty("002", "xiaohong");
           prop.setProperty("003", "xiaolan");

           prop.setProperty("小龙女", "尹志平");
           prop.setProperty("郭襄", "杨过");
           prop.setProperty("黄蓉", "欧阳克");


           BufferedWriter writer = new BufferedWriter(new FileWriter("a.properties"));

           //prop.store(writer, null);
           //保存数据到文件 参1是帮助写数据的流对象 参数2是保存的数据的说明 会写到文件里,可以不写 传null
           prop.store(writer, "保存的数据hello");

      }
    }

1.2.2. 代码1 Properties结合BufferedReader加载数据

Properties prop = new Properties();
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
​
//从流中读取数据到集合
prop.load(br);
​
System.out.println(prop);
​
System.out.println(prop.getProperty("小龙女"));
System.out.println(prop.getProperty("郭襄"));
System.out.println(prop.getProperty("黄蓉"));

1.3. Properties集合案例

1.3.1. 需求

  • 在Properties文件中手动写上姓名和年龄,读取到Properties集合中,将该数据封装成学生对象,序列化写到本地文件中

1659253680144

1.3.2. 步骤

  • 创建Properties集合,将本地文件中的数据加载到集合中
  • 获取集合中的键值对数据,封装到学生对象中
  • 创建序列化流对象,将学生对象序列化到本地文件中

1.3.3. 代码实现

  • 学生类
public class Student {
   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 +
               '}';
   }
}

1.3.4. 代码(一个一个序列化)

public class Test {
    public static void main(String[] args) throws IOException {
        //1.创建Properties集合对象,使用字符读取缓冲流将本地文件中的数据加载到集合对象中
        //2.获取集合中的键值对数据,封装到学生对象中
        //3.创建序列化流对象,将学生对象序列化到本地文件中
        Properties prop = new Properties();
        //加载属性文件到集合prop
        prop.load(new BufferedReader(new FileReader("threadmodule/persons.properties")));
​
        //创建对象输出流
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("threadmodule/abc.txt"));
        //遍历集合
        Set<String> names = prop.stringPropertyNames();
        for (String name : names) {
            //根据属性名 或者属性值
            String age = prop.getProperty(name);
            //封装到学生对象里 然后写入文件
            oos.writeObject(new Student((String) name, Integer.parseInt(age)));
        }
        oos.close();
​
        //创建对象输入流 用来读取对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("threadmodule/abc.txt"));
        //ois.readObject读取对象 如果读完了 继续读 会报异常EOFException  是IOException的子类
        while (true) {
            try {
                //读取学生对象
                Student s = (Student) ois.readObject();
                System.out.println(s);
            } catch (IOException e) {
                //System.out.println("遇到了异常 说明全部 读完了");
                break;
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}

代码(保存到集合里一起序列化)

​
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Properties;
​
public class Demo05 {
    public static void main(String[] args) {
        //1 读取stus这个属性文件
        Properties prop = new Properties();
        try {
            FileReader fr = new FileReader("mymodule/stus.properties");
            //2加载文件数据
            prop.load(fr);
//            System.out.println(prop);
            //3 遍历prop对象 创建学生对象 存到一个新的list集合里
            ArrayList<Student> stus = new ArrayList<>();
            for (String name : prop.stringPropertyNames()) {
                //根据属性名字 或者属性的值
                String age = prop.getProperty(name);
                //创建学生对象
                Student stu = new Student(name, Integer.parseInt(age));
                //添加到list集合
                stus.add(stu);
            }
//            System.out.println(stus);
​
            //把集合序列化保存到文件
            ObjectOutputStream oos = new ObjectOutputStream(
                    new FileOutputStream("mymodule/students.txt"));
            //把list集合整体序列化保存
            oos.writeObject(stus);
            oos.close();
​
        } catch (IOException e) {
            e.printStackTrace();
        }
​
    }
}
如人饮水,冷暖自知。
最后更新于 2023-08-05