深度解析Java中的Properties集合

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

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

我是一名后端开发爱好者,工作日常接触到最多的就是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 !!!


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

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

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

相关推荐
爱可生开源社区3 分钟前
SCALE | SQLFlash 在 SQL 优化维度上的表现评估
后端
Java爱好狂.18 分钟前
Java面试Redis核心知识点整理!
java·数据库·redis·分布式锁·java面试·后端开发·java八股文
sheji341629 分钟前
【开题答辩全过程】以 基于Java的应急安全学习平台的设计与实现为例,包含答辩的问题和答案
java·开发语言·学习
程序员小假40 分钟前
我们来说一下消息的可靠性投递
java·后端
duangww1 小时前
SAPUI5 1.71.78老版本的消费restful服务
后端·restful
席之郎小果冻1 小时前
【04】【创建型】【聊一聊,建造者模式】
java·前端·建造者模式
用户8599681677691 小时前
UE5虚幻引擎汽车HMI设计高级研修课
后端
用户8599681677691 小时前
鸿蒙HarmonyOS多线程编程实战:AI语音
后端
原来是好奇心1 小时前
深入Spring Boot源码(四):Starter机制与依赖管理深度解析
java·源码·springboot·starter