Properties(配置文件):主要用于存储配置文件到硬盘上面和读取配置文件

public class Properties extends Hashtable<Object,Object>

注意:
    Properties实现了Map<Object, Object>接口
    Hashtable因为继承Dictionary类的,而这个类已经被淘汰了,新的实现类应该实现Map接口,例如HashMap和TreeMap
    Hashtable是通过"拉链法"实现的哈希表,它包括几个重要的成员变量:table, count, threshold, loadFactor, modCount。
    table是一个 Entry[] 数组类型,而 Entry实际上就是一个单向链表。哈希表的"key-value键值对"都是存储在Entry数组中的。

Properties构造方法:
    Properties()   创建一个无默认值的空属性列表。
    Properties(Properties defaults)    创建一个带有指定默认值的空属性列表。

Properties一些方法:
    setProperty(String key, String value)    其是本质是调用了 Hashtable 的方法 put,它只不过是确认了key和value的类型为String,因为在我们在生成配置文件的时候,会强制把键值对的类型转为String存储到Properties对象中Entry数组中
        注意:Properties对象也可以使用父类的类的put方法,但是这样我们就可以随便传入任何类型的键值对,这样可能会导致强转失败会报错的。调用setProperty方法是为了防止这个情况出现

store(OutputStream out, String comments)   以iso8859_1(欧洲)的格式存储到硬盘上面,如果存储中文会出现乱码
    store(Writer writer, String comments)    以gbk格式存储到硬盘上面(最好使用这个)

load(InputStream inStream)   把配置文件信息加载到存储在Entry数组中(也就是Properties对象中)
    load(Reader reader)       把配置文件信息加载到存储在Entry数组中(也就是Properties对象中)
    
    getProperty(String key) 在配置文件中根据key值读取key对应的值,如果找到返回key对应的值,找不到返回null
    getProperty(String key, String defaultValue) 在配置文件中根据key值查找键值对,如果查到返回key对应的值,找不到返回defaultValue值

Properties要注意的细节:
    1.在使用setProperty方法的时候会把key和value的类型都是String类型,如果我们存储其他类型的数据,会出现强转失败的现象
    2.如果配置文件信息一但使用了中文,那么在使用store方法生成配置文件的时候只能使用字符流来解决store(Writer writer, String comments)
    3.如果内容发生改变,一定要重新生成配置文件,因为我们使用load方法加载文件的时候,是把文件存储在了Properties对象中(Entry数组中)
    4.创建FileOutputStream对象一定要在load方法的后面,因为创建FileOutputStream对象的时候会清空配置文件里面的信息,如果写在load的前面这样我们使用load加载配置文件信息的时候,加载不到

//需求:使用一款软件,这个软件只能使用三次,第三次jvm会自动退出无法使用(我们可以在配置文件中存储一个int类型count的数据,用来存储使用的次数)

public class Demo1 {
public static void main(String[] args) throws IOException {
//首先我们应该判断这个使用者是否以前使用过这个软件,判断是否已经存在配置文件
File file = new File("D:\\新建文件夹\\a.properties");
//判断配置文件是否存在,如果不存在那么创建配置文件
if(!file.exists()) {
file.createNewFile();
}
//创建Properties对象
Properties properties = new Properties();
//把配置文件中的数据加载到prooerties中
properties.load(new FileReader(file));
//定义一个变量用来存储使用次数
int count = 1;
//获取这个key所对应的值
String value = properties.getProperty("count");
//判断配置配置文件中是否存在这个key值
if(value!=null) {
count = Integer.parseInt(value);
} //判断使用次数是否为3
if(count == 3) {
System.out.println("你已经使用了3次了,请购买正版");
System.exit(0);
} System.out.println("使用了"+count+"次");
count++; properties.setProperty("count",count+"");
properties.store(new FileWriter(file), "runtime");
}
}

运行的结果

a.properties文件

												

最新文章

  1. 7.2WebApi2中的全局异常处理
  2. MySQL sql语言的笔记
  3. 多线程基础(七)GCD线程组+栅栏函数
  4. Linux学习之二——档案与目录的属性和权限
  5. php的urlencode()URL编码函数浅析
  6. MongoDB常用操作一查询find方法db.collection_name.find()
  7. linux开机启动增加tomcat启动项
  8. Adapting to views using css or js
  9. C - How Many Tables - HDU-1213
  10. 浪漫桃心的Android表白程序
  11. MYSQL 查看表上索引的 1 方法
  12. Win10 清理自带APP
  13. [phvia/firman] PHP多进程服务器模型中的惊群
  14. [转]一个简洁的 systemd 操作指南
  15. wps 批量调整图片大小 宏
  16. 使用Messenger 从Activity发送数据到service 通过后台计算结果Log输出;
  17. C# 64位系统调用32位DLL异常解决办法(异常来自HRESULT :0x8007007E)
  18. HDUOJ-----4506小明系列故事——师兄帮帮忙
  19. mySQL数据库一:数据类型
  20. ZOJ3712:Hard to Play

热门文章

  1. 使用IDEA实现品优购项目搭建
  2. react 编写 基于ant.design 页面的参考笔记
  3. 【leetcode】993. Cousins in Binary Tree
  4. AcWing 234. 放弃测试 (01分数规划)打卡
  5. [CSP-S模拟测试]:影魔(树状数组+线段树合并)
  6. 探索Redis设计与实现13:Redis集群机制及一个Redis架构演进实例
  7. appium自动化测试- 元素操作
  8. 用Processing生成屏保(二)
  9. Rust &lt;1&gt;:数据类型、变量、可变性、常量、隐藏
  10. raid 5