Java中I/O流读写配置文件,并通过反射创建对象,并利用配置文件的数据给对象赋值

1.先用输出流将配置文件写入文件中

2.用输入流读取配置文件的信息,在控制台打印其中的内容

3.用反射通过配置文件的内容创建对象,并给对象的属性赋值(对象的属性的数据类型只有字符串和整数类型)

自定义类的简单代码:

public class Studen {
    //三个属性
    private String name;
    private String gender;
    private Integer age;

    @Override
    public String toString() {//重写tostring方法为了方便打印学生对象的属性值
        return "Studen{" +
                "name='" + name + '\'' +
                ", gender='" + gender + '\'' +
                ", age=" + age +
                '}';
    }
}

测试类代码:

import org.junit.Test;

import java.io.*;
import java.lang.reflect.Field;
import java.util.Properties;
import java.util.Set;

public class Test01 {
    @Test
    public void test01(){
        //写配置文件
        Properties pro = new Properties();
        pro.setProperty("name", "黎明");
        pro.setProperty("gender", "男");
        pro.setProperty("age", "55");
        pro.setProperty("class", "cn.itcast.demo01.Studen");
        //创建输出流
        try (OutputStream out = new FileOutputStream("D:\\develop\\code\\0408\\srcstudent.properties")) {
            //将配置文件放到该模块的src文件下,不然后面读取的时候会引发文件找不到异常
            pro.store(out,"stuMessage");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Test
    public void test02() throws IOException {
        //读取配置文件
        Properties pro = new Properties();
        //创建输入流(通过类加载器获取输入流)
       InputStream in = Test01.class.getClassLoader().getResourceAsStream("student.properties");
        //InputStream in = new FileInputStream("student.properties");
       pro.load(in);
       in.close();
        System.out.println(pro);
    }
    @Test
    public void test03(){
        //根据配置文件信息创建对象,并给对象赋值
        //定义集合保存读取的数据
        Properties pro = new Properties();
        //通过类加载器获取配置文件的输入流
        InputStream in = Test01.class.getClassLoader().getResourceAsStream("student.properties");
        try {
            pro.load(in);//读取配置文件数据
        } catch (IOException e) {
            e.printStackTrace();
        }
        //获取类的全限定名
        String className = pro.getProperty("class");
        try {
            //根据全限定名创建class对象
            Class clazz = Class.forName(className);//创建class对象
            //根据class对象创建学生对象
            Studen stu = (Studen)clazz.newInstance();
            //获取配置文件的所有键的集合
            //排除class并在剩下的键中找到键相对应的字段的类型,如果类型是字符串就直接赋值,否则就将该键对应的值解析成整数类型并给对象赋值
            Set<String> keys = pro.stringPropertyNames();
            for (String key : keys) {
                if (!key.equals("class")) {
                    Field filed = clazz.getDeclaredField(key);//获取字段(属性)
                    filed.setAccessible(true);//设置字段为可使用的
                    Class type = filed.getType();//获取字段的类型
                    if (type.equals(String.class)) {//如果字段类型为字符串类型
                        filed.set(stu,pro.getProperty(key));//给字段赋值
                    }else {//字段类型不是字符串
                        filed.set(stu,Integer.parseInt(pro.getProperty(key)));
                        //将字段值解析成整数类型,然后再给属性赋值
                    }
                }
            }
            System.out.println(stu);//打印学生对象信息
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }

    }
}

猜你喜欢

转载自blog.csdn.net/xilin6664/article/details/89133107
今日推荐