深度解析Java中的Properties集合

2023-11-17 11:57:32 浏览数 (1)

哈喽,各位小伙伴们,你们好呀,我是喵手。

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

  如下是Java集合体系架构图,近期几期内容都是围绕该体系进行知识讲解,以便于同学们学习Java集合篇知识能够系统化而不零散。

在这里插入图片描述在这里插入图片描述

前言

  在Java开发中,我们常常需要读取一些配置文件,如数据库配置文件、日志配置文件等。而在Java中,我们可以使用Properties集合来读取这些配置文件,方便快捷。本文将从Properties集合的源代码解析、应用场景案例、优缺点分析、类代码方法介绍、测试用例等多个方面进行讲解。

摘要

  本文将介绍Java中的Properties集合,包括其基本特性、源代码解析、应用场景案例、优缺点分析、类代码方法介绍和测试用例。读者将能够了解Properties集合的基本概念和使用方法,以及如何在实际开发中应用。

Properties集合

简介

  Properties是一个键值对集合,可以用来表示一组配置信息,通常用于读取配置文件。在Java中,它是一个Hashtable的子类,因此具有Hashtable的所有特性。Properties集合中的键和值都是字符串类型,且键和值之间用等于号“=”连接。

在Java中,我们通常使用以下方法来读取Properties文件:

代码语言:java复制
Properties prop = new Properties();
InputStream in = new FileInputStream("config.properties");
prop.load(in);

  其中config.properties为配置文件名,prop.load(in)方法将配置文件中的键值对加载到Properties集合中。接下来,我们可以通过以下方法获取键对应的值:

代码语言:java复制
String value = prop.getProperty("key");

源代码解析

  在Properties集合的源代码中,我们可以看到它是一个Hashtable的子类,因此继承了Hashtable的所有方法和特性。同时,它也实现了Map接口,因此也可以使用Map中的方法。

  Properties集合中的键和值都是字符串类型,因此它提供了一些特殊的方法来获取不同类型的值。例如getProperty(String key, String defaultValue)方法可以在无法找到键值对时返回默认值,getProperty(String key)方法可以获取键对应的值。

代码语言:java复制
public String getProperty(String key, String defaultValue) {
    String val = getProperty(key);
    return (val == null) ? defaultValue : val;
}

public synchronized String getProperty(String key) {
    Object oval = super.get(key);
    String sval = (oval instanceof String) ? (String)oval : null;
    return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
}

  在读取Properties文件时,Properties集合使用了InputStream来读取数据,并将其转换为字符流。

在这里插入图片描述在这里插入图片描述

具体实现如下:

代码语言:java复制
public synchronized void load(InputStream inStream) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(inStream, "8859_1"));
    while (true) {
        String line = in.readLine();
        if (line == null)
            return;
        if (line.length() > 0) {
            char c = line.charAt(0);
            if ((c != '#') && (c != '!'))
                while (continueLine(line)) {
                    String nextLine = in.readLine();
                    if (nextLine == null)
                        nextLine = "";
                    String loppedLine = line.substring(0, line.length() - 1);
                    line = loppedLine   nextLine;
                }
            int len = line.length();
            int keyStart;
            for (keyStart = 0; keyStart < len; keyStart  )
                if (whiteSpaceChars.indexOf(line.charAt(keyStart)) == -1)
                    break;
            if (keyStart == len)
                continue;
            char firstChar = line.charAt(keyStart);
            if ((firstChar == '\') || (firstChar == '#') || (firstChar == '!')) {
                keyStart  ;
                if (keyStart == len)
                    continue;
            }
            int separatorIndex = -1;
            for (int i = keyStart; i < len; i  ) {
                char currentChar = line.charAt(i);
                if (currentChar == '\')
                    i  ;
                else if (separators.indexOf(currentChar) != -1) {
                    separatorIndex = i;
                    break;
                }
            }
            int valueStart = separatorIndex   1;
            while (valueStart < len) {
                char c = line.charAt(valueStart);
                if (whiteSpaceChars.indexOf(c) == -1)
                    if ((c == '\') || (c == '#') || (c == '!'))
                        valueStart  ;
                    else
                        break;
                valueStart  ;
            }
            String key = loadConvert(line.substring(keyStart, separatorIndex >= 0 ? separatorIndex : len), true);
            String value = loadConvert(line.substring(valueStart, len), false);
            put(key, value);
        }
    }
}

  在这段代码中,loadConvert(String str, boolean escape)方法用于将字符串转换为字符流。continueLine(String line)方法用于处理连续行,即当当前行以反斜杠结尾时,读取下一行并将其合并到当前行中。

在这里插入图片描述在这里插入图片描述

应用场景案例

  Properties集合通常用于读取配置文件,例如数据库配置、日志配置等。通过将配置信息保存在Properties集合中,我们可以很方便地获取和修改配置信息。

下面是一个简单的配置文件示例:

代码语言:java复制
db.url=jdbc:mysql://127.0.0.1:3306/db_java
db.password=654321
db.username=admin

在读取配置文件时,我们可以使用以下代码:

代码语言:java复制
Properties prop = new Properties();
InputStream in = new FileInputStream("config/config.properties");
prop.load(in);

String url = prop.getProperty("db.url");
String username = prop.getProperty("db.username");
String password = prop.getProperty("db.password");

优缺点分析

Properties集合的优点在于:

  • 简单易用:Properties集合提供了简单易用的方法来读取和写入配置文件。
  • 高效性能:Properties集合是基于Hashtable实现的,因此具有Hashtable的高效性能和稳定性。
  • 可读性:配置文件的格式为键值对,易于阅读和修改。

Properties集合的缺点在于:

  • 类型限制:Properties集合中的键和值都是字符串类型,因此不支持其他类型的数据。
  • 无法保证顺序:Properties集合中的键值对存储顺序是不确定的,因此无法保证读取和写入时的顺序。

类代码方法介绍

以下是Properties类中常用的方法:

  • getProperty(String key, String defaultValue):获取键对应的值,如果键不存在则返回默认值。
  • getProperty(String key):获取键对应的值,如果键不存在则返回null。
  • setProperty(String key, String value):设置键值对。
  • load(InputStream in):从输入流中加载键值对。
  • store(OutputStream out, String comments):将所有键值对写入输出流中。

完整的Properties类代码可以在Java SE的官方文档中查看。

测试用例

我们可以编写以下测试用例来测试Properties集合的读取和写入功能:

测试代码演示

代码语言:java复制
package com.example.javase.collection;

import java.io.*;
import java.util.Properties;

/**
 * @author ms
 * @date 2023/10/26 18:19
 */
public class PropertiesTest {
    public static void main(String[] args) throws IOException {
        Properties prop = new Properties();

        // 读取配置文件
        InputStream in = new FileInputStream("config/config.properties");
        prop.load(in);
        in.close();

        // 获取配置信息
        String url = prop.getProperty("db.url");
        String username = prop.getProperty("db.username");
        String password = prop.getProperty("db.password");
        System.out.println("db.url = "   url);
        System.out.println("db.username = "   username);
        System.out.println("db.password = "   password);

        // 修改配置信息
        prop.setProperty("db.password", "654321");
        OutputStream out = new FileOutputStream("config/config.properties");
        prop.store(out, null);
        System.out.println("修改后的db.password = "   prop.getProperty("db.password"));
        out.close();
    }
}

  在这个测试用例中,我们读取了一个配置文件并输出了其中的配置信息。然后,我们修改了一个配置项的值并保存到配置文件中。

如下是我们用来测试的配置文件:config.properties

在这里插入图片描述在这里插入图片描述

配置内容如下:

代码语言:java复制
db.password=123456
db.url=jdbc:mysql://127.0.0.1:3306/db_java
db.username=admin

测试结果

  根据如上测试用例,本地测试结果如下,仅供参考,你们也可以自行修改测试用例或者添加更多的测试数据或测试方法,进行熟练学习以此加深理解。

在这里插入图片描述在这里插入图片描述

测试代码分析

  根据如上测试用例,在此我给大家进行深入详细的解读一下测试代码,以便于更多的同学能够理解并加深印象。

  这是一个Java代码文件,其中主要涉及了Java中的Properties类。该类用于读取和修改配置文件(.properties文件),并且具有方便的读取和写入配置属性的方法。

  首先,代码创建了一个空的Properties对象prop,然后使用InputStream读取配置文件config/config.properties中的属性信息,并将其加载到Properties对象中。之后,通过getProperty()方法获取属性值并将其输出到控制台。接着,代码修改了属性db.password的值,并使用OutputStream将修改后的属性写入到配置文件中。

  这个代码示例实现了对配置文件的读取和修改操作,可以作为Java中处理配置文件的示例参考。

全文小结

  本文介绍了Java中的Properties集合,包括其基本特性、源代码解析、应用场景案例、优缺点分析、类代码方法介绍和测试用例。Properties集合通常用于读取配置文件,具有简单易用、高效性能和可读性等优点。同时在实际开发过程中,我们需要根据具体情况选择合适的方案来使用Properties集合,以避免出现问题。

总结

  本文介绍了Java中的Properties集合,它是一个键值对集合,通常用于读取配置文件。Properties集合具有简单易用、高效性能和可读性等优点,同时,它也有类型限制和无法保证顺序等缺点。本文深入分析了Properties集合的源代码,介绍了其常用方法,并给出了测试用例。在实际开发中,我们需要根据具体情况选择合适的方案来使用Properties集合,以避免出现问题。

... ...

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

... ...

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。

⭐️若有疑问,就请评论留言告诉我叭。

我正在参与2023腾讯技术创作特训营第三期有奖征文,组队打卡瓜分大奖!

0 人点赞