深度解析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 !!!


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

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

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

相关推荐
utmhikari几秒前
【架构艺术】Go语言微服务monorepo的代码架构设计
后端·微服务·架构·golang·monorepo
蜡笔小新星3 分钟前
Flask项目框架
开发语言·前端·经验分享·后端·python·学习·flask
计算机学姐7 分钟前
基于Asp.net的驾校管理系统
vue.js·后端·mysql·sqlserver·c#·asp.net·.netcore
欢乐少年19042 小时前
SpringBoot集成Sentry日志收集-3 (Spring Boot集成)
spring boot·后端·sentry
夏天的味道٥3 小时前
使用 Java 执行 SQL 语句和存储过程
java·开发语言·sql
冰糖码奇朵5 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
好教员好5 小时前
【Spring】整合【SpringMVC】
java·spring
浪九天6 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
堕落年代6 小时前
Maven匹配机制和仓库库设置
java·maven
功德+n6 小时前
Maven 使用指南:基础 + 进阶 + 高级用法
java·开发语言·maven