1. 什么是properties?

它是一种文本格式。里面的数据有自己规定的格式,一般存放键值对类型的数据。

好处:可以很好很方便的跟java程序进行交互。java提供专门跟properties交互的API。存到properties文件中的内容是可以持久化的。

2.properties的使用

  • 里面的注释是使用#
  • 键值之间一般使用=分割。也可以使用:号跟空格分割,但是尽量使用=号。

3. JAVA跟properties的交互

3.1 数据的读取

//        1, java   --- IO ---  硬盘上的文件
        File file = new File("day04-02/src/hello.properties");
        System.out.println(file.exists());
        FileInputStream fis = new FileInputStream(file);
//        2, java 已经帮我们定义好了Properties类
        Properties p  = new Properties();
        p.load(fis);

//        枚举器(Hashtable  Vector) 迭代器
        Enumeration<Object> keys = p.keys();
        while (keys.hasMoreElements()){
            String key = (String) keys.nextElement();
            System.out.println(key + " = " + p.getProperty(key) );
        }

3.2 数据的存储

public static void main(String[] args) throws IOException {
        //1配置文件,如果不存在就创建文件
        File f = new File("day04/src/home/softerware.properties");
        if (!f.exists()) {
            f.createNewFile();
        }
        //2.把配置文件的属性读取出来
        FileInputStream fis = new FileInputStream(f);
        //准备要保存的数据集合
        Properties p = new Properties();
        p.load(fis);
        fis.close();

//        3,读取参数,保存到配置文件中。
        p.setProperty("1","英雄联盟");
        p.setProperty("2", "和平精英");
//         4.数据存储到数据文件中
        FileOutputStream fos = new FileOutputStream("day04/src/home/softerware.properties");
        p.store(fos,"");
        fos.close();
    }

3.3 其它

获取资源文件的流我们还可以通过InputStream fis = Demo03.class.getClassLoader().getResourceAsStream(“hello.properties”);方式。但是这种方式会将数据缓存到虚拟机中,如果缓存有数据则使用,没有则读取文件。

4. 案例

模拟一个软件试用期的案例,比如一个程序如果使用了5天(次)就提示“试用已结束,请购买正版”,不足5次则可以继续使用。

public static void main(String[] args) throws Exception {
//        1,第1次,配置文件如果不存在就创建这个文件
        File f = new File("day04-02/src/software.properties");
        if(!f.exists()){
            f.createNewFile();
        }

//        2,把配置文件中的属性读取出来
        FileInputStream fis = new FileInputStream(f);
        Properties p = new Properties();
        p.load(fis);
        fis.close();

//        3,读取参数,如果时null说明是第一次使用,则初始化次数为1,保存到配置文件中。
        String count = p.getProperty("count");
        if(Objects.isNull(count)){
            count = "1" ;
            p.setProperty("count" ,count);
        }else{
//            4,如果不是第一次使用,则取出这个值,增加1,然后再保存进去
            int i = Integer.parseInt(count);
            if(i>=5){
//                5,保存的数据如果超过5次则提示
                System.out.println("使用次数超过5次,请购买正版");
                return ;
            }
            i++ ;
            p.setProperty("count" ,""+i);
        }

    //6,把次数的数据存储到数据文件中
        FileOutputStream fos = new FileOutputStream(f);
        p.store(fos,"");
        fos.close();


    }

注意事项:
当既有读取又有存储的时候:

请注意一个问题:先用完一个管子(流)关闭。
    然后再开另外一个管子(流),用完再关闭。
    请不要同时开2个管子(流)。