返回顶部
首页 > 资讯 > 精选 >Properties如何使用
  • 429
分享到

Properties如何使用

2023-06-16 18:06:24 429人浏览 薄情痞子
摘要

本篇内容介绍了“Properties如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!01. 摘要Map 的实现类有  Has

本篇内容介绍了“Properties如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

01. 摘要

Map 的实现类有  HashMap、LinkedHashMap、TreeMap、IdentityHashMap、WeakHashMap、Hashtable、Properties  等等。

Properties如何使用

02. 简介

Properties 类是 java 工具包中非常重要的一个类,比如在实际开发中,有些变量,我们可以直接硬写入到自定义的 java 枚举类中。

但是有些变量,在测试环境、预生产环境、生产环境,变量所需要取的值都不一样,这个时候,我们可以通过使用 properties  文件来加载程序需要的配置信息,以达到一行代码,多处环境都可以运行的效果!

最常见的比如 JDBC  数据源配置文件,properties文件以.properties作为后缀,文件内容以键=值格式书写,左边是变量名称,右边是变量值,用#做注释,比如新建一个jdbc.properties文件,内容如下:

Properties如何使用

Properties 类是 properties 文件和程序的中间桥梁,不论是从 properties 文件读取信息,还是写入信息到 properties  文件,都要经由 Properties 类。

好了,唠叨了这么多,咱们回到本文要介绍的主角Properties!

集合 Map 架构图可以看出,Properties 继承自 Hashtable,表示一个持久的 map 集合,属性列表以 key-value  的形式存在,Properties 类定义如下:

public class Properties extends Hashtable<Object,Object> {     ...... }

Properties 除了继承 Hashtable 中所定义的方法,Properties 也定义了以下几个常用方法,如图所示:

 Properties如何使用

常用方法介绍

set 方法(添加修改元素)

set 方法是将指定的 key, value 对添加到 map 里,在添加元素的时候,调用了 Hashtable 的 put 方法,与 Hashtable  不同的是, key 和 value 都是字符串

打开 Properties 的 setProperty 方法,源码如下:

public synchronized Object setProperty(String key, String value) {     //调用父类 Hashtable 的 put 方法     return put(key, value); }

方法测试如下:

public static void main(String[] args) {     Properties properties = new Properties();     properties.setProperty("name1","张三");     properties.setProperty("name2","张四");     properties.setProperty("name3","张五");     System.out.println(properties.toString()); }

输出结果:

{name3=张五, name2=张四, name1=张三}

get 方法(搜索指定元素)

get 方法根据指定的 key 值返回对应的 value,第一步是从调用 Hashtable 的 get  方法,如果有返回值,直接返回;如果没有返回值,但是初始化时传入了defaults变量,从 defaults变量中,也就是 Properties  中,去搜索是否有对于的变量,如果有就返回元素值。

打开 Properties 的 getProperty 方法,源码如下:

public String getProperty(String key) {     //调用父类 Hashtable 的 get 方法     Object oval = super.get(key);     String sval = (oval instanceof String) ? (String)oval : null;      //进行变量非空判断     return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval; }

查看 defaults 这个变量,源码如下:

public class Properties extends Hashtable<Object,Object> {     protected Properties defaults; }

这个变量在什么时候赋值呢,打开源码如下:

public Properties(Properties defaults) {     this.defaults = defaults; }

可以发现,在 Properties 构造方法初始化阶段,如果你给了一个自定义的 defaults ,当调用 Hashtable 的 get  方法没有搜索到元素值的时候,并且 defaults 也不等于空,那么就会进一步在 defaults 里面进行搜索元素值。

方法测试如下:

public static void main(String[] args) {     Properties properties = new Properties();     properties.setProperty("name1","张三");     properties.setProperty("name2","张四");     properties.setProperty("name3","张五");     //将 properties 作为参数初始化到 newProperties 中     Properties newProperties = new Properties(properties);     newProperties.setProperty("name4","李三");     //查询key中 name1 的值     System.out.println("查询结果:" + properties.getProperty("name1")); }

输出结果:

通过key查询结果:张三

load方法(加载配置文件)

load 方法,表示将 properties 文件以输入流的形式加载文件,并且提取里面的键、值对,将键值对元素添加到 map 中去。

打开 Properties 的 load 方法,源码如下:

public synchronized void load(InputStream inStream) throws ioException {     //读取文件流     load0(new LineReader(inStream)); }

load0 方法,源码如下:

private void load0 (LineReader lr) throws IOException {     char[] convtBuf = new char[1024];     int limit;     int keyLen;     int valueStart;     char c;     boolean hasSep;     boolean precedingBackslash;      //一行一行的读取     while ((limit = lr.readLine()) >= 0) {         c = 0;         keyLen = 0;         valueStart = limit;         hasSep = false;          precedingBackslash = false;         //判断key的长度         while (keyLen < limit) {             c = lr.lineBuf[keyLen];             if ((c == '=' ||  c == ':') && !precedingBackslash) {                 valueStart = keyLen + 1;                 hasSep = true;                 break;             } else if ((c == ' ' || c == '\t' ||  c == '\f') && !precedingBackslash) {                 valueStart = keyLen + 1;                 break;             }             if (c == '\\') {                 precedingBackslash = !precedingBackslash;             } else {                 precedingBackslash = false;             }             keyLen++;         }         //获取值的起始位置         while (valueStart < limit) {             c = lr.lineBuf[valueStart];             if (c != ' ' && c != '\t' &&  c != '\f') {                 if (!hasSep && (c == '=' ||  c == ':')) {                     hasSep = true;                 } else {                     break;                 }             }             valueStart++;         }         //获取文件中的键和值参数         String key = loadConvert(lr.lineBuf, 0, keyLen, convtBuf);         String value = loadConvert(lr.lineBuf, valueStart, limit - valueStart, convtBuf);         //调用 Hashtable 的 put 方法,将键值加入 map 中         put(key, value);     } }

好了,我们来在src/recources目录下,新建一个custom.properties配置文件,内容如下:

#定义一个变量名称和值 userName=李三 userPwd=123456 userAge=18 userGender=男 userEmail=123@123.com

方法测试如下:

public class TestProperties  {      public static void main(String[] args) throws Exception {         //初始化 Properties         Properties prop = new Properties();         //加载配置文件         InputStream in = TestProperties .class.getClassLoader().getResourceAsStream("custom.properties");         //读取配置文件,指定编码格式,避免读取中文乱码         prop.load(new InputStreamReader(in, "UTF-8"));         //将内容输出到控制台         prop.list(System.out);     } }

输出结果:

userPwd=123456

userEmail=123@123.com

userAge=18

userName=李三

userGender=男

propertyNames方法(读取全部信息)

propertyNames 方法,表示读取 Properties 的全部信息,本质是创建一个新的 Hashtable 对象,然后将原 Hashtable  中的数据复制到新的 Hashtable 中,并将 map 中的 key 全部返回。

打开 Properties 的 propertyNames 方法,源码如下:

public Enumeration<?> propertyNames() {     Hashtable<String,Object> h = new Hashtable<>();     //将原 map 添加到新的 Hashtable 中     enumerate(h);     //返回 Hashtable 中全部的 key 元素     return h.keys(); }

enumerate 方法,源码如下:

private synchronized void enumerate(Hashtable<String,Object> h) {     //判断 Properties 中是否有初始化的配置文件     if (defaults != null) {         defaults.enumerate(h);     }     //将原 Hashtable 中的数据添加到新的 Hashtable 中     for (Enumeration<?> e = keys() ; e.hasMoreElements() ;) {         String key = (String)e.nextElement();         h.put(key, get(key));     } }

方法测试如下:

public static void main(String[] args) throws Exception {     //初始化 Properties     Properties prop = new Properties();     //加载配置文件     InputStream in = TestProperties.class.getClassLoader().getResourceAsStream("custom.properties");     //读取配置文件,指定读取编码 UTF-8,防止内容乱码     prop.load(new InputStreamReader(in, "UTF-8"));     //获取 Properties 中全部的 key 元素     Enumeration enProp = prop.propertyNames();     while (enProp.hasMoreElements()){         String key = (String) enProp.nextElement();         String value = prop.getProperty(key);         System.out.println(key + "=" + value);     } }

输出内容如下:

userPwd=123456

userEmail=123@123.com

userAge=18

userName=李三

userGender=男

总结

Properties 继承自 Hashtable,大部分方法都复用于 Hashtable,比如,get、put、remove、clear 方法,**与  Hashtable 不同的是, Properties中的 key 和 value 都是字符串,**如果需要获取 properties  中全部内容,可以先通过迭代器或者 propertyNames 方法获取 map 中所有的 key 元素,然后遍历获取 key 和 value。

需要注意的是,Properties 中的 setProperty 、load 方法,都加了synchronized同步,用来控制线程同步。

03. properties 文件的加载方式

在实际开发中,经常会遇到读取配置文件路径找不到,或者读取文件内容乱码的问题,下面简单介绍一下,properties 文件的几种常用的加载方式。

properties 加载文件的方式,大致可以分两类,第一类是使用 java.util.Properties 的 load 方法来加载文件流;第二类是使用  java.util.ResourceBundle 类来获取文件内容。

在src/recources目录下,新建一个custom.properties配置文件,文件编码格式为UTF-8,内容还是以刚刚那个测试为例,各个加载方式如下!

通过文件路径来加载文件

这类方法加载文件,主要是调用 Properties 的 load 方法,获取文件路径,读取文件以流的形式加载文件。

方法如下:

Properties prop = new Properties(); //获取文件绝对路径 String filePath = "/coding/java/src/resources/custom.properties"; //加载配置文件 InputStream in = new FileInputStream(new File(filePath)); //读取配置文件 prop.load(new InputStreamReader(in, "UTF-8")); System.out.println("userName:"+prop.getProperty("userName"));

输出结果:

userName:李三 

通过当前类加载器的getResourceAsStream方法获取

这类方法加载文件,也是调用 Properties 的 load  方法,不同的是,通过类加载器来获取文件路径,如果当前文件是在src/resources目录下,那么直接传入文件名就可以了。

方法如下:

Properties prop = new Properties(); //加载配置文件 InputStream in = TestProperties.class.getClassLoader().getResourceAsStream("custom.properties"); //读取配置文件 prop.load(new InputStreamReader(in, "UTF-8")); System.out.println("userName:"+prop.getProperty("userName"));

输出结果:

userName:李三

使用ClassLoader类的getSystemResourceAsStream方法获取

和上面类似,也是通过类加载器来获取文件流,方法如下:

Properties prop = new Properties();//加载配置文件InputStream in =  ClassLoader.getSystemResourceAsStream("custom.properties");//读取配置文件prop.load(new  InputStreamReader(in,  "UTF-8"));System.out.println("userName:"+prop.getProperty("userName"));

输出结果:

userName:李三

使用 ResourceBundle 类加载文件

ResourceBundle 类加载文件,与 Properties 有所不同,ResourceBundle 获取 properties  文件不需要加.properties后缀名,只需要文件名即可。

ResourceBundle 是按照iso8859编码格式来读取原属性文件,如果是读取中文内容,需要进行转码处理。

方法如下:

//加载custom配置文件,不需要加`.properties`后缀名 ResourceBundle resource = ResourceBundle.getBundle("custom"); //转码处理,解决读取中文内容乱码问题 String value = new String(resource.getString("userName").getBytes("ISO-8859-1"),"UTF-8"); System.out.println("userName:"+value);

输出结果:

userName:李三

“Properties如何使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Properties如何使用

本文链接: https://lsjlt.com/news/284625.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Properties如何使用
    本篇内容介绍了“Properties如何使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!01. 摘要Map 的实现类有  Has...
    99+
    2023-06-16
  • Mybatis中properties和settings标签如何使用
    Mybatis中properties和settings标签如何使用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Mybatis properties标签和settings标...
    99+
    2023-06-20
  • java中properties配置文件如何使用
    在Java中,可以使用Properties类来读取和写入配置文件,配置文件通常是以.properties文件格式保存的。1. 读取配...
    99+
    2023-10-18
    java
  • application与properties如何使用spring boot进行配置
    本篇文章给大家分享的是有关 application与properties如何使用spring boot进行配置,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体代码如下所示:#...
    99+
    2023-05-31
    springboot properties application
  • Java如何读写Properties配置文件(Properties类)
    目录Java读写Properties配置文件Properties基本介绍Properties常用方法Properties读取配置文件Properties写入配置文件propertie...
    99+
    2023-05-20
    Java读写Properties配置文件 Java Properties类 Java Properties配置文件
  • Spring中怎么使用Properties
    这篇文章主要介绍“Spring中怎么使用Properties”,在日常操作中,相信很多人在Spring中怎么使用Properties问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2024-04-02
  • java properties类怎么使用
    在Java中,可以通过Properties类来读取和写入属性文件。下面是Properties类的使用示例:1. 创建Properti...
    99+
    2023-09-20
    java
  • properties配置文件如何使用Spring Boot进行读取
    这篇文章给大家介绍properties配置文件如何使用Spring Boot进行读取,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在SpringApplication类中: private ConfigurableE...
    99+
    2023-05-31
    springboot properties
  • Properties怎么在Spring中使用
    Properties怎么在Spring中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 在 xml 配置文件中使用即自动替换 ${} 里面的值。<bean&nbs...
    99+
    2023-05-30
  • Spring如何加载properties文件
    这篇文章主要介绍“Spring如何加载properties文件”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Spring如何加载properties文件”文章能帮助大家解决问题。spring第三方资...
    99+
    2023-07-02
  • java如何读取properties的值
    在Java中,可以使用java.util.Properties类来读取properties文件的值。 以下是一个简单的示例: imp...
    99+
    2024-02-29
    Java
  • css(properties)怎么在jQuery中使用
    这篇文章将为大家详细讲解有关css(properties)怎么在jQuery中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。css的全称是什么css的全称是Cascading Style...
    99+
    2023-06-14
  • properties-maven-plugin插件怎么使用
    这篇“properties-maven-plugin插件怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“propert...
    99+
    2023-06-26
  • Properties文件如何利用Java实现读取
    今天就跟大家聊聊有关Properties文件如何利用Java实现读取,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。使用J2SE API读取Properties文件的六种方法1。使用J...
    99+
    2023-05-31
    java properties ava
  • Springboot如何获取yml、properties参数
    目录如何获取yml、properties参数1、使用@Value()注解2、使用 @component配置文件读取yml自定义参数(亲测可用)首先自定义一个参数利用平时@value ...
    99+
    2024-04-02
  • springboot如何获取properties属性值
    这篇文章主要介绍springboot如何获取properties属性值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!获取properties属性值方式总结spring boot 在多环境情况下我们需要根据不同的获取不...
    99+
    2023-06-29
  • 如何解决使用@Value(${×××))从properties文件取值碰到的问题
    这篇文章主要介绍“如何解决使用@Value(${×××))从properties文件取值碰到的问题”,在日常操作中,相信很多人在如何解决使用@Value(${×××))从properties文件取值碰到的问题问题上存在疑惑,小编查阅了各式资...
    99+
    2023-06-20
  • 怎么使用J2SE读取Properties文件
    小编给大家分享一下怎么使用J2SE读取Properties文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用J2SE读取Properties文件的六种方式:1...
    99+
    2023-06-17
  • 浅谈java Properties类的使用基础
    Properties类继承自HashTable,通常和io流结合使用。它最突出的特点是将key/value作为配置属性写入到配置文件中以实现配置持久化,或从配置文件中读取这些属性。它的这些配置文件的规范后缀名为".properties"。表...
    99+
    2023-05-30
  • java如何获取properties文件内容
    在Java中,可以使用Properties类来获取properties文件的内容。具体方法如下:1. 创建Properties对象并...
    99+
    2023-09-13
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作