Properties(hashtable的子类)
Properties:
Properties是hashtable的子类(在java.util包中)。该集合的特点:可以用于键值对形式的配置文件,且不允许Key重复,若有重复的,后者会覆盖前者。
也就是说它具备map集合的特点,而且它里面存储的键值对都是字符串。
是集合中和IO技术相结合的集合容器。
Java中有个比较重要的类Properties(Java.util.Properties),主要用于读取Java的配置文件,各种语言都有自己所支持的配置文件,配置文件中很多变量是经常改变的,这样做也是为了方便用户,让用户能够脱离程序本身去修改相关的变量设置。像Python支持的配置文件是.ini文件,同样,它也有自己读取配置文件的类ConfigParse,方便程序员或用户通过该类的方法来修改.ini配置文件。在Java中,其配置文件常为.properties文件,格式为文本文件,文件的内容的格式是“键=值”的格式,文本注释信息可以用"#"来注释。
1,继承关系

2.常用方法

【案例演示】:通过setProperty()方法来设置属性信息。
import java.util.Properties;
import java.util.Set; public class PropertiesDemo {
public static void main(String[] args) {
Properties properties=new Properties();
properties.setProperty("zhangsan","20");//设置键值对,注意参数都是String类型
properties.setProperty("lisi","21");
properties.setProperty("lisi","22");
System.out.println(properties);
String value=properties.getProperty("lisi");//通过Key获取Value
System.out.println("李四的值为:"+value);
Set<String> names=properties.stringPropertyNames();//返回的是Key的集合
for (String name:names) {
System.out.println(name+"---"+properties.getProperty(name));
}
}
}
运行结果:

上面那个例子是通过方法来将属性信息添加到集合中的,那如何将文件中已存在的属性信息又存储到集合中来呢?
【案例演示】:如何将流中的数据存储到集合中。
import java.io.*;
import java.util.Properties;
import java.util.Scanner; public class FileToProperties {
public static void main(String[] args) throws IOException {
Scanner in=new Scanner(System.in);
String filename=in.nextLine();
BufferedReader br=new BufferedReader(new FileReader(filename));//因为是文本,所以Reader.
Properties properties=new Properties();//定义一个集合
String str=null;
while ((str=br.readLine())!=null){//读取文本中的数据
String[] keys= str.split("=");
properties.setProperty(keys[0],keys[1]);//存储到集合中
}
br.close();
System.out.println(properties);
}
}
运行结果:

由于上述代码操作太麻烦,所以在1.6版本之后出现了load()方法。可以直接将流对象作为参数传递给load()方法。
load(Reader reader);
load(InputStream in);
import java.io.*;
import java.util.Properties;
import java.util.Scanner; public class FileToProperties {
public static void main(String[] args) throws IOException {
Scanner in=new Scanner(System.in);
String filename=in.nextLine();
BufferedReader br=new BufferedReader(new FileReader(filename));//因为是文本,所以Reader.
Properties properties=new Properties();//定义一个集合
properties.load(br);//直接将流对象加载进集合
br.close();
properties.list(System.out);//将属性列表输出到指定的输出流中。此处是控制台
}
}
假如你通过上述代码将配置文件中属性信息都打印出来后,发现Key为“lisi”的Value值存储错了,于是你想到了用Properties中的setProperty()方法重新设置lisi的值。
但是通过查文档你就会发现,setProperty()方法只是单纯的将内存中的值改了,而本地文件中值却没有改,当关闭电脑后,内存中的信息就会清零,那么当下次在加载配置文件时,去到lisi的Value值仍为改过之前的。
所以还要用store()方法,将集合中的信息再次写入流中,并保存到本地文档。
import java.io.*;
import java.util.Properties;
import java.util.Scanner; public class FileToProperties {
public static void main(String[] args) throws IOException {
Scanner in=new Scanner(System.in);
String filename=in.nextLine();
BufferedReader br=new BufferedReader(new FileReader(filename));//因为是文本,所以Reader.
Properties properties=new Properties();//定义一个集合
properties.load(br);//直接将流对象加载进集合
properties.setProperty("lisi","00");//重新设置属性
FileWriter fw=new FileWriter(filename);
properties.store(fw,"bianji");//将修改完的集合再次保存到文件中,第二个参数为注释信息
br.close();
properties.list(System.out);
}
}
运行之前的文档信息:

运行完文档信息发生变化:(注意#号为注释信息!!)

【案例演示】:用于记录应用程序运行次数,如果使用次数已到,那么就会给出注册提示。
注意:计数前要先将配置文件加载进来,计数后要将集合数据写入文档!
还要注意计数文件是在第一次访问程序之后才创建的。
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties; public class UseCount {
public static void main(String[] args) throws IOException {
Properties properties = new Properties();//创建一个集合
File file=new File("c:\\html\\test\\demo.txt");//将要读取的文件封装成对象
if(!file.exists()){//先判断计数文件是否已被创建
file.createNewFile();//不存在则要先创建
}
FileInputStream fis = new FileInputStream(file);//将封装成对象的文件加载到输入流中
properties.load(fis);//然后将流加载到集合中
String num = properties.getProperty("count");//获取集合中Key为count的Value值
if(num==null){//如果value为null
properties.setProperty("count",Integer.toString(1));
}else {
int count=Integer.valueOf(properties.getProperty("count"));
++count;
if(count>5){
System.out.println("次数用完!");return;
}
properties.setProperty("count",Integer.toString(count));
}
FileOutputStream fos=new FileOutputStream(file);
properties.store(fos,"kk");
fis.close();
fos.close();
}
}
Properties(hashtable的子类)的更多相关文章
- properties类是Hashtable的子类
properties类是Hashtable的子类 增加了将Hashtable对象中的关键字保存到文件和从文件中读取关键字和值到Hashtable对象中的方法 Properties.store方法存储P ...
- Properties属性操作
package com.properties; import java.io.FileInputStream; import java.io.FileOutputStream; import java ...
- 第19章 集合框架(3)-Map接口
第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...
- 【Java编程思想笔记】-集合2
详细的接口API转自博客:https://blog.csdn.net/jyg0723/article/details/80498840#collection-api-%E8%AF%A6%E8%A7%A ...
- java工程师-面试知识点总结
目录(转载) [x] 一.Java基础(语言.集合框架.OOP.设计模式等) [x] 二.Java高级(JavaEE.框架.服务器.工具等) [x] 三.多线程和并发 [x] 四.Java虚拟机 [x ...
- (1)集合 ---遍历map集合
Map接口 实现Map接口的类用来存储键(key)-值(value) 对.Map 接口的实现类有HashMap和TreeMap等.Map类中存储的键-值对通过键来标识,所以键值不能重复. Ha ...
- Java研发工程师知识点总结
Java研发工程师知识点总结 最近一次更新2017年12月08日 大纲 一.Java基础(语言.集合框架.OOP.设计模式等) 二.Java高级(JavaEE.框架.服务器.工具等) 三.多线程和并发 ...
- java(集合框架)(转)
前言 集合①只能存放对象,存放基本类型会自动转成对应的对象②可以存放不同类型的对象(如果不使用泛型的话),且不限数量③集合中存放的只是对象的引用 集合详解 集合-1.png 集合-2.png It ...
- Java集合框架要点概括(Core Knowledge of Java Collection)
目录 有哪些集合类 Set类 Queue类 List类 Map类 HashMap的实现原理,是否线程安全,如何使其做到线程安全 HashMap的实现原理 HashMap的数据结构 HashMap的存取 ...
随机推荐
- JavaScript(1)---绑定事件、解除绑定事件
JavaScript(1)---绑定事件.解除绑定事件 一.事件概述 1.事件的几个概念 · 事件 指的是文档或者浏览器窗口中发生的一些特定交互瞬间.我们可以通过侦听器(或者处理程序)来预定事件,以便 ...
- python3复习
一.基础11.运行python代码cmd->python 文件路径/文件名称2.解释器针对linux/uinux系统3.注释单行注释 #多行注释 三个单引号或三个双引号4.变量法律规 ...
- MyBatis3——输出参数ResultType、动语态sql
输出参数ResultType 1.输出参数为简单类型(8个基本+String) 2.输出参数为对象类型 3.输出参数为实体对象类型的集合:虽然输出类型为集合,但是resultType依然写集合的元素类 ...
- 树莓派通过模数转换芯片ADC0832读取LM35温度传感器数据
树莓派通过模数转换芯片ADC0832读取LM35温度传感器数据 今天和小朋友一起玩树莓派,打算来做一个测量室温的小实验.经过几个小时的研究和测试,终于能够成功读取LM35传感器的温度数据了.本文主要记 ...
- openpyxl库实现对excel文档进行编辑(追加写入)
首先,这个库只支持xlsx格式的excel文件 预期,对”excel_test.xlsx“的A1单元格写入”hello word“ 1.安装”openpyxl“库,pip install openpy ...
- Linux 高压缩率工具 XZ 压缩详解
目录 一.XZ 基础信息 二.安装 三.详解 3.1.常用的参数 3.2. 常用命令 四.扩展 4.1.unxz 4.2.xzcat 4.3.lzma 4.4.unlzma 4.5.lzcat 一.X ...
- ThreeJS 物理材质shader源码分析(像素着色器)
再此之前推荐一款GLTF物理材质在线编辑器https://tinygltf.xyz/ 像素着色器(meshphysical_frag.glsl) #define PHYSICAL uniform ve ...
- 深入理解Java 中SPI 制
深入理解Java 中SPI 制 概述 SPI(Service Provider Interface),是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用,比 ...
- redis--->字符串和哈希对比
redis 的字符串和哈希对比 相同点和不同点 相同点: 首先是他们有很多效果类似的命令,比如set和hset,mset和hmset等等 大多数情况下使用字符串存储的场景使用hash也可以实现. 不同 ...
- android开发实战-记账本APP(二)
继昨天的开发,继续完成今天的内容. (一)开始构建一些业务逻辑,开始构建记账本的添加一笔记账的功能. ①对fab按钮的click时间进行修改,创建一个AlertDialog.Builder对象,因此我 ...