🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # Properties Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。 ~~~ public class Properties extends Hashtable<Object,Object> ~~~ 在使用Properties类的时候不需要设置泛型,因为从它一开始出现就只能保持字符串 特点: 1. Hashtable的子类,map集合中的方法都可以用。 2. 该集合没有泛型。键值都是字符串。 3. 它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。 4. 有和流技术相结合的方法。 ![](https://box.kancloud.cn/c2083c2c677362f433d72f9a8c8a641c_914x366.png) ~~~ 设置属性 public synchronized Object setProperty(String key, String value) 取得属性 public String getProperty(String key) 取得属性,如果key不存在返回默认值 public String getProperty(String key, String defaultValue) ~~~ ~~~ //创建集合对象 Properties prop = new Properties(); //添加元素到集合 //prop.put(key, value); prop.setProperty("周迅", "张学友"); prop.setProperty("李小璐", "贾乃亮"); prop.setProperty("杨幂", "刘恺威"); //System.out.println(prop);//测试的使用 //遍历集合 Set<String> keys = prop.stringPropertyNames(); for (String key : keys) { //通过键 找值 //prop.get(key) String value = prop.getProperty(key); System.out.println(key+"==" +value); } ~~~ # 注释 `加 #` ## 将集合中内容存储到文件 需求:使用Properties集合,完成把集合内容存储到IO流所对应文件中的操作 分析: 1. 创建Properties集合 2. 添加元素到集合 3. 创建流 4. 把集合中的数据存储到流所对应的文件中 ~~~ stroe(Writer,comments) store(OutputStream,commonts) ~~~ 把集合中的数据,保存到指定的流所对应的文件中,参数commonts代表对描述信息 5. 关闭流 ~~~ //1. 创建Properties集合 Properties prop = new Properties(); //2. 添加元素到集合 prop.setProperty("周迅", "张学友"); prop.setProperty("李小璐", "贾乃亮"); prop.setProperty("杨幂", "刘恺威"); //3. 创建流 FileWriter out = new FileWriter("prop.properties"); //4. 把集合中的数据存储到流所对应的文件中 // save data会形成阻塞 prop.store(out, "save data"); //5. 关闭流 out.close(); ~~~ ## 读取文件中的数据,并保存到集合 需求:从属性集文件prop.properties 中取出数据,保存到集合中 分析: 1,创建集合 2,创建流对象 3,把流所对应文件中的数据 读取到集合中 load(InputStream) 把指定流所对应的文件中的数据,读取出来,保存到Propertie集合中 load(Reader) 4,关闭流 5,显示集合中的数据 ~~~ public static void main(String[] args) throws IOException { //1,创建集合 Properties prop = new Properties(); //2,创建流对象 FileInputStream in = new FileInputStream("prop.properties"); //FileReader in = new FileReader("prop.properties"); //3,把流所对应文件中的数据 读取到集合中 prop.load(in); //4,关闭流 in.close(); //5,显示集合中的数据 System.out.println(prop); } ~~~ # ResourceBundle 工具 ~~~ //jdk提供的工具类加载properties文件,名字db.properties的后缀可以省略 ResourceBundle bundle = ResourceBundle.getBundle("db"); //通过key获得需要的值 String driver = bundle.getString("driver"); System.out.println(driver); ~~~ 1. 只能加载 classes 下面的资源文件 2. 只能读取 .properties文件 ## 国际化 后缀可以省略 根据当前语言环境取出 ~~~ public static final ResourceBundle getBundle(String baseName); ~~~ 设置语言环境 ~~~ public static final ResourceBundle getBundle(String baseName, Locale locale); ~~~ java.text是专门负责国际化的包,这个包里面有一个专门处理占位数据的操作类: MessageFormat; 格式化文本 ~~~ public static String format(String patten, Object... arguments); ~~~ 修改properties文件 ~~~ wel.msg = 欢迎{0}光临,现在时间是:{1}! ~~~ 例子 ~~~ ResourceBundle db = ResourceBundle.getBundle("db"); String str = db.getString("wel.msg"); System.out.println(MessageFormat.format(str, "jdxia", new Date())); ~~~ 国际化的程序可以根据国家不同显示不同内容,这时候需要Locale类帮忙了 Locale保存的是一个国家的区域和编码 * 中国: zh_CN * 美国: en_US 可以在定义资源的文件的时候加上指定语言编码 定义中文的资源文件: db_zh_CN.properties 所有的语言代码由Locale类设置,在Local类中 ~~~ * 构造方法: public Locale(String language, String country); * 取得当前语言环境: public static Locale getDefault(); ~~~ 例子 ~~~ Locale loc = new Locale("en", "US"); ResourceBundle db = ResourceBundle.getBundle("db", loc); String str = db.getString("wel.msg"); System.out.println(str); ~~~