深入理解Java中的Properties类

 更新时间:2024年01月30日 09:09:12   作者:码农研究僧  
Properties类是Java中用于处理配置文件的工具类,它继承自 Hashtable类,实现了Map接口,本文主要介绍了Java中的Properties类,感兴趣的可以了解一下

前言

使用Properties出现中文乱码可看我这篇文章:properties出现中文乱码解决方法(万能)

1. 基本知识

Properties 类是 Java 中用于处理配置文件的工具类,它继承自 Hashtable 类,实现了 Map 接口。

  • 主要用于读取和写入属性文件,以键值对的形式存储数据。
  • 配置文件通常以 .properties 为扩展名,其中每一行表示一个属性或配置项。

使用该类可以更好的处理文件:

  • 配置文件管理: 主要用于读取和保存应用程序的配置信息,例如数据库连接信息、用户设置等。
  • 国际化: 用于加载不同语言的资源文件,方便国际化应用程序。
  • 持久化: 可以将配置信息持久化到文件,以便下次程序启动时重新加载。

对于其方法可查看其API接口:Properties API接口

构造方法如下:

方法表述
Properties()创建一个没有默认值的空属性列表。
Properties​(int initialCapacity)创建一个没有默认值的空属性列表,并且初始大小容纳指定数量的元素,而无需动态调整大小。
Properties​(Properties defaults)创建具有指定默认值的空属性列表。

常用的方法如下:

返回类型方法表述
StringgetProperty​(String key)
getProperty​(String key, String defaultValue)
在此属性列表中搜索具有指定键的属性。
voidlist​(PrintStream out)
list​(PrintWriter out)
将此属性列表打印到指定的输出流。
voidload​(InputStream inStream)从输入字节流中读取属性列表(键和元素对)。
voidload​(Reader reader)以简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
ObjectsetProperty​(String key, String value)调用 Hashtable方法 put 。
voidstore​(OutputStream out, String comments)将此 Properties表中的此属性列表(键和元素对)以适合使用 load(InputStream)方法加载到 Properties表的格式写入输出流。
voidstore​(Writer writer, String comments)将此 Properties表中的此属性列表(键和元素对)以适合使用 load(Reader)方法的格式写入输出字符流。

2. 代码示例

当使用 Properties 类时,你可以使用上述方法来读取和写入属性。以下是这些方法的一些简单的代码示例:

1. getProperty(String key)

Properties properties = new Properties();
try (InputStream input = new FileInputStream("config.properties")) {
    properties.load(input);

    // 获取属性值
    String value = properties.getProperty("key");
    System.out.println("Value for key 'key': " + value);
} catch (IOException e) {
    e.printStackTrace();
}

2. getProperty(String key, String defaultValue)

Properties properties = new Properties();
try (InputStream input = new FileInputStream("config.properties")) {
    properties.load(input);

    // 获取属性值,如果不存在则使用默认值
    String value = properties.getProperty("nonexistentKey", "default");
    System.out.println("Value for key 'nonexistentKey': " + value);
} catch (IOException e) {
    e.printStackTrace();
}

3. list(PrintStream out) / list(PrintWriter out)

Properties properties = new Properties();
try (InputStream input = new FileInputStream("config.properties")) {
    properties.load(input);

    // 打印属性列表到控制台
    properties.list(System.out);
} catch (IOException e) {
    e.printStackTrace();
}

4. load(InputStream inStream)

Properties properties = new Properties();
try (InputStream input = new FileInputStream("config.properties")) {
    // 从输入流中读取属性列表
    properties.load(input);

    // 遍历所有键值对
    for (String key : properties.stringPropertyNames()) {
        String value = properties.getProperty(key);
        System.out.println(key + ": " + value);
    }
} catch (IOException e) {
    e.printStackTrace();
}

5. store(OutputStream out, String comments)

Properties properties = new Properties();
properties.setProperty("key1", "value1");
properties.setProperty("key2", "value2");

try (OutputStream output = new FileOutputStream("output.properties")) {
    // 将属性列表写入输出流
    properties.store(output, "Comments for the output file");
} catch (IOException e) {
    e.printStackTrace();
}

6. store(Writer writer, String comments)

Properties properties = new Properties();
properties.setProperty("key1", "value1");
properties.setProperty("key2", "value2");

try (Writer writer = new FileWriter("output.properties")) {
    // 将属性列表写入输出字符流
    properties.store(writer, "Comments for the output file");
} catch (IOException e) {
    e.printStackTrace();
}

3. Demo

上述的API方法可适当选择,完整的Demo可充分了解这个类的整体逻辑:

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

public class PropertiesDemo {

    public static void main(String[] args) {
        // 创建 Properties 对象
        Properties properties = new Properties();

        // 设置属性值
        properties.setProperty("username", "码农研究僧");
        properties.setProperty("password", "123456789");
        properties.setProperty("server", "https://blog.csdn.net/weixin_47872288");

        // 将属性列表写入输出流
        try (OutputStream output = new FileOutputStream("config.properties")) {
            properties.store(output, "Sample Configuration");
            System.out.println("Properties written to config.properties");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 从输入流中读取属性列表
        try (InputStream input = new FileInputStream("config.properties")) {
            properties.load(input);

            // 获取属性值
            String username = properties.getProperty("username");
            String password = properties.getProperty("password");
            String server = properties.getProperty("server");

            System.out.println("Username: " + username);
            System.out.println("Password: " + password);
            System.out.println("Server: " + server);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 打印属性列表到控制台
        /**
         * -- listing properties --
         * password=123456789
         * server=https://blog.csdn.net/weixin_47872288
         * username=码农研究僧
         */
        properties.list(System.out);
    }
}

终端输出结果如下:

在这里插入图片描述

到此这篇关于深入理解Java中的Properties类的文章就介绍到这了,更多相关Java Properties类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • 浅谈Springboot下引入mybatis遇到的坑点

    浅谈Springboot下引入mybatis遇到的坑点

    这篇文章主要介绍了Springboot下引入mybatis遇到的坑点,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 浅谈Java实现回溯算法之八皇后问题

    浅谈Java实现回溯算法之八皇后问题

    八皇后问题是一个古老而又著名的问题,是学习回溯算法的一个经典案例。今天我们就一起来探究一下吧
    2021-06-06
  • Spring使用ThreadPoolTaskExecutor自定义线程池及异步调用方式

    Spring使用ThreadPoolTaskExecutor自定义线程池及异步调用方式

    这篇文章主要介绍了Spring使用ThreadPoolTaskExecutor自定义线程池及异步调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java8中的default关键字详解

    Java8中的default关键字详解

    这篇文章主要介绍了Java8中的default关键字详解,在实现某个接口的时候,需要实现该接口所有的方法,这个时候default关键字就派上用场了。通过default关键字定义的方法,集成该接口的方法不需要去实现该方法,需要的朋友可以参考下
    2023-08-08
  • Java 图解Spring启动时的后置处理器工作流程是怎样的

    Java 图解Spring启动时的后置处理器工作流程是怎样的

    spring的后置处理器有两类,bean后置处理器,bf(BeanFactory)后置处理器。bean后置处理器作用于bean的生命周期,bf的后置处理器作用于bean工厂的生命周期
    2021-10-10
  • 浅谈Java自定义注解相关知识

    浅谈Java自定义注解相关知识

    今天带大家来学习Java注解的相关知识,文中对自定义注解作了非常详细的介绍,对正在学习Java的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • Java手动配置线程池过程详解

    Java手动配置线程池过程详解

    这篇文章主要介绍了Java手动配置线程池过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java实现对象排序的两种方式详解

    Java实现对象排序的两种方式详解

    这篇文章主要介绍了Java实现对象排序的两种方式详解,在Java中经常会涉及到对象数组的排序问题,则就提到对象之间的比较问题,今天我们就来看一下两种不同排序方式之间的区别,需要的朋友可以参考下
    2023-09-09
  • SpringBoot使用MyBatis时的几种传参规范示例

    SpringBoot使用MyBatis时的几种传参规范示例

    使用Mybatis作为持久层框架时,对于数据库的增删改查等操作都需要参数的传递,本文就详细的介绍了一下SpringBoot使用MyBatis时的几种传参规范示例,感兴趣的可以了解一下
    2022-02-02
  • 获取JPEGImageEncoder和JPEGCode这两个类的方法

    获取JPEGImageEncoder和JPEGCode这两个类的方法

    下面小编就为大家带来一篇获取JPEGImageEncoder和JPEGCode这两个类的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07

最新评论