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\ |
从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串 |
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集合中,将该数据封装成学生对象,序列化写到本地文件中
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();
}
}
}
Comments NOTHING