最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中Properties類(lèi)和properties文件示例詳解

 更新時(shí)間:2025年08月25日 08:39:07   作者:AA-代碼批發(fā)V哥  
在Java中Properties類(lèi)是用于讀取和處理屬性文件的類(lèi),屬性文件是以鍵值對(duì)的形式存儲(chǔ)數(shù)據(jù)的簡(jiǎn)單文本文件,這篇文章主要介紹了Java中Properties類(lèi)和properties文件的相關(guān)資料,需要的朋友可以參考下

前言

Java開(kāi)發(fā)中配置文件是存儲(chǔ)程序參數(shù)的常用方式,而properties文件因其簡(jiǎn)潔的鍵值對(duì)格式,成為最常用的配置文件類(lèi)型之一,與之配套的java.util.Properties類(lèi),則是操作properties文件的核心工具。

一、properties配置文件基礎(chǔ)

1.1 什么是properties文件?

properties文件是一種以.properties為后綴的文本文件,采用鍵值對(duì)(key=value) 格式存儲(chǔ)數(shù)據(jù),主要用于存儲(chǔ)配置信息(如數(shù)據(jù)庫(kù)連接參數(shù)、系統(tǒng)參數(shù)等)。

示例:db.properties(數(shù)據(jù)庫(kù)配置)

# 數(shù)據(jù)庫(kù)連接配置(#為注釋?zhuān)?
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test?useSSL=false
jdbc.username=root
jdbc.password=123456
# 連接池參數(shù)
jdbc.maxActive=20
jdbc.minIdle=5

1.2 properties文件的語(yǔ)法規(guī)則

  1. 鍵值對(duì)格式key=value(等號(hào)前后可空格,如key = value);
  2. 注釋:以#!開(kāi)頭的行(如# 這是注釋! 這也是注釋);
  3. 換行規(guī)則:一行一個(gè)鍵值對(duì),若值過(guò)長(zhǎng)需換行,可在末尾加\(如key=value1\+換行+value2);
  4. 編碼:Java默認(rèn)以ISO-8859-1編碼讀取,若包含中文需特殊處理(后續(xù)講解);
  5. 大小寫(xiě)敏感keyvalue區(qū)分大小寫(xiě)(如Namename是不同的key)。

1.3 properties文件的優(yōu)勢(shì)

  • 簡(jiǎn)潔直觀:鍵值對(duì)格式易于讀寫(xiě)和維護(hù);
  • 跨平臺(tái):文本文件,可在不同系統(tǒng)中使用;
  • 與Java無(wú)縫集成Properties類(lèi)原生支持,無(wú)需額外依賴(lài);
  • 動(dòng)態(tài)配置:無(wú)需修改代碼,通過(guò)修改配置文件即可調(diào)整程序行為。

二、Properties類(lèi)詳解

java.util.Properties是Java提供的操作properties文件的工具類(lèi),繼承自Hashtable<Object, Object>,核心功能是讀取和寫(xiě)入鍵值對(duì)配置。

2.1 Properties類(lèi)的核心方法

方法名作用示例
load(InputStream in)從輸入流讀取properties文件內(nèi)容props.load(new FileInputStream("db.properties"))
store(OutputStream out, String comments)將鍵值對(duì)寫(xiě)入輸出流(生成properties文件)props.store(new FileOutputStream("out.properties"), "注釋")
getProperty(String key)根據(jù)key獲取value(返回String)String driver = props.getProperty("jdbc.driver")
getProperty(String key, String defaultValue)獲取value,若key不存在則返回默認(rèn)值String port = props.getProperty("jdbc.port", "3306")
setProperty(String key, String value)設(shè)置鍵值對(duì)(添加或修改)props.setProperty("jdbc.timeout", "30")
stringPropertyNames()獲取所有key的集合(返回Set)Set<String> keys = props.stringPropertyNames()

2.2 Properties類(lèi)的使用流程

使用Properties類(lèi)操作配置文件的通用流程:

  1. 創(chuàng)建Properties對(duì)象;
  2. 通過(guò)load()方法讀取properties文件;
  3. 通過(guò)getProperty()獲取配置值;
  4. (可選)通過(guò)setProperty()修改配置;
  5. (可選)通過(guò)store()寫(xiě)入新的properties文件。

三、Properties類(lèi)操作properties文件

3.1 讀取properties文件

3.1.1 讀取類(lèi)路徑下的properties文件

在Maven項(xiàng)目中,properties文件通常放在src/main/resources目錄下(編譯后位于類(lèi)路徑),讀取方式:

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.Set;

public class PropertiesReadDemo {
    public static void main(String[] args) {
        // 1. 創(chuàng)建Properties對(duì)象
        Properties props = new Properties();

        try (
            // 2. 獲取類(lèi)路徑下的文件輸入流(自動(dòng)關(guān)閉流)
            InputStream in = PropertiesReadDemo.class.getClassLoader().getResourceAsStream("db.properties")
        ) {
            if (in == null) {
                throw new RuntimeException("未找到db.properties文件");
            }

            // 3. 加載文件內(nèi)容
            props.load(in);

            // 4. 讀取配置(方式1:指定key)
            String driver = props.getProperty("jdbc.driver");
            String url = props.getProperty("jdbc.url");
            System.out.println("數(shù)據(jù)庫(kù)驅(qū)動(dòng):" + driver);
            System.out.println("連接URL:" + url);

            // 4. 讀取配置(方式2:遍歷所有key)
            Set<String> keys = props.stringPropertyNames();
            System.out.println("\n所有配置:");
            for (String key : keys) {
                String value = props.getProperty(key);
                System.out.println(key + " = " + value);
            }

            // 4. 讀取配置(方式3:帶默認(rèn)值)
            String port = props.getProperty("jdbc.port", "3306"); // 不存在則返回3306
            System.out.println("\n數(shù)據(jù)庫(kù)端口:" + port);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

關(guān)鍵說(shuō)明

  • getClassLoader().getResourceAsStream("db.properties"):從類(lèi)路徑讀取文件,無(wú)需關(guān)心具體路徑;
  • 使用try-with-resources語(yǔ)法自動(dòng)關(guān)閉輸入流,避免資源泄露;
  • getProperty支持默認(rèn)值,適合處理可選配置。

3.1.2 讀取絕對(duì)路徑的properties文件

若文件不在類(lèi)路徑下(如D:/config/db.properties),需通過(guò)絕對(duì)路徑讀?。?/p>

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class PropertiesAbsolutePathDemo {
    public static void main(String[] args) {
        Properties props = new Properties();
        // 絕對(duì)路徑
        String filePath = "D:/config/db.properties";

        try (InputStream in = new FileInputStream(filePath)) {
            props.load(in);
            System.out.println("用戶(hù)名:" + props.getProperty("jdbc.username"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.2 寫(xiě)入properties文件

通過(guò)store()方法可將Properties對(duì)象中的鍵值對(duì)寫(xiě)入文件,常用于生成配置或保存修改。

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Properties;

public class PropertiesWriteDemo {
    public static void main(String[] args) {
        // 1. 創(chuàng)建Properties對(duì)象并添加配置
        Properties props = new Properties();
        props.setProperty("app.name", "MyApplication");
        props.setProperty("app.version", "1.0.0");
        props.setProperty("app.author", "JavaDeveloper");

        // 2. 寫(xiě)入文件
        String filePath = "src/main/resources/app.properties";
        try (OutputStream out = new FileOutputStream(filePath)) {
            // store(輸出流, 注釋):注釋會(huì)被添加到文件開(kāi)頭
            props.store(out, "Application Configuration");
            System.out.println("配置文件寫(xiě)入成功:" + filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

生成的app.properties內(nèi)容

#Application Configuration
#Mon Jul 29 15:30:00 CST 2024
app.author=JavaDeveloper
app.name=MyApplication
app.version=1.0.0

注意store()會(huì)自動(dòng)添加時(shí)間戳注釋?zhuān)益I值對(duì)按ASCII排序輸出。

3.3 處理包含中文的properties文件

properties文件默認(rèn)以ISO-8859-1編碼存儲(chǔ),直接寫(xiě)入中文會(huì)導(dǎo)致亂碼。解決方式有兩種:

方式1:手動(dòng)轉(zhuǎn)義中文(不推薦)

將中文轉(zhuǎn)為Unicode編碼(如中文\u4E2D\u6587),可通過(guò)Java工具類(lèi)實(shí)現(xiàn):

public class ChineseEscapeDemo {
    public static void main(String[] args) {
        String chinese = "數(shù)據(jù)庫(kù)配置";
        // 轉(zhuǎn)為Unicode
        String unicode = new String(escapeChinese(chinese).getBytes());
        System.out.println(unicode); // 輸出:\u6570\u636E\u5E93\u914D\u7F6E
    }

    // 中文轉(zhuǎn)Unicode工具方法
    private static String escapeChinese(String str) {
        StringBuilder sb = new StringBuilder();
        for (char c : str.toCharArray()) {
            if (c > 127) {
                sb.append("\\u").append(Integer.toHexString(c));
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }
}

缺點(diǎn):可讀性差,維護(hù)困難,僅適合少量中文場(chǎng)景。

方式2:使用UTF-8編碼讀寫(xiě)(推薦)

通過(guò)InputStreamReaderOutputStreamWriter指定UTF-8編碼,直接讀寫(xiě)中文。

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Properties;

public class PropertiesUtf8Demo {
    public static void main(String[] args) {
        // 1. 寫(xiě)入U(xiǎn)TF-8編碼的properties文件(含中文)
        Properties props = new Properties();
        props.setProperty("app.name", "我的應(yīng)用");
        props.setProperty("app.desc", "這是一個(gè)測(cè)試應(yīng)用");

        try (
            OutputStream out = new FileOutputStream("src/main/resources/app_utf8.properties");
            // 指定UTF-8編碼寫(xiě)入
            Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8)
        ) {
            props.store(writer, "UTF-8編碼的配置文件(含中文)");
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 2. 讀取UTF-8編碼的properties文件
        try (
            InputStream in = new FileInputStream("src/main/resources/app_utf8.properties");
            // 指定UTF-8編碼讀取
            Reader reader = new InputStreamReader(in, StandardCharsets.UTF_8)
        ) {
            Properties readProps = new Properties();
            readProps.load(reader);
            System.out.println("應(yīng)用名稱(chēng):" + readProps.getProperty("app.name")); // 輸出:我的應(yīng)用
            System.out.println("應(yīng)用描述:" + readProps.getProperty("app.desc")); // 輸出:這是一個(gè)測(cè)試應(yīng)用
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

關(guān)鍵:讀寫(xiě)時(shí)均通過(guò)InputStreamReaderOutputStreamWriter指定UTF_8編碼,確保中文正常顯示。

四、properties文件在框架中的應(yīng)用

properties文件是Java框架的標(biāo)配配置方式,以Spring和MyBatis為例:

4.1 Spring框架中的properties文件

Spring通過(guò)<context:property-placeholder>加載properties文件,實(shí)現(xiàn)配置注入:

1. 配置文件(db.properties)

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test

2. Spring配置文件(spring.xml)

<!-- 加載properties文件 -->
<context:property-placeholder location="classpath:db.properties"/>

<!-- 注入配置到Bean -->
<bean id="dataSource" class="com.zaxxer.hikari.HikariConfig">
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
</bean>

4.2 MyBatis中的properties文件

MyBatis通過(guò)<properties>標(biāo)簽加載配置,用于動(dòng)態(tài)替換SQL中的參數(shù):

1. 配置文件(mybatis.properties)

db.username=root
db.password=123456

2. MyBatis配置文件(mybatis-config.xml)

<configuration>
    <!-- 加載properties文件 -->
    <properties resource="mybatis.properties"/>

    <!-- 在數(shù)據(jù)源中引用 -->
    <environments default="development">
        <environment id="development">
            <dataSource type="POOLED">
                <property name="username" value="${db.username}"/>
                <property name="password" value="${db.password}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

五、常見(jiàn)問(wèn)題與避坑指南

5.1 讀取文件時(shí)出現(xiàn)NullPointerException

錯(cuò)誤InputStream in = ...返回null,導(dǎo)致props.load(in)報(bào)錯(cuò)。

原因

  • 文件路徑錯(cuò)誤(如類(lèi)路徑下不存在該文件);
  • 使用Class.getResourceAsStream()時(shí),路徑前缺少/(相對(duì)路徑問(wèn)題)。

解決方案

  • 確認(rèn)文件位置:Maven項(xiàng)目中,src/main/resources下的文件編譯后位于類(lèi)路徑根目錄;
  • 正確獲取流:
    // 類(lèi)路徑根目錄下的文件
    InputStream in = PropertiesDemo.class.getClassLoader().getResourceAsStream("db.properties");
    
    // 若文件在包下(如com/example/config/db.properties)
    InputStream in = PropertiesDemo.class.getResourceAsStream("/com/example/config/db.properties");
    

5.2 中文亂碼問(wèn)題

錯(cuò)誤:讀取properties文件中的中文顯示為???或亂碼。

原因

  • 未指定UTF-8編碼讀寫(xiě)(默認(rèn)ISO-8859-1);
  • 文件實(shí)際編碼與讀寫(xiě)編碼不一致(如文件是GBK,卻用UTF-8讀?。?。

解決方案

  • 統(tǒng)一使用UTF-8編碼讀寫(xiě)(通過(guò)InputStreamReaderOutputStreamWriter);
  • 檢查文件實(shí)際編碼(右鍵文件→查看/修改編碼格式)。

5.3 配置覆蓋問(wèn)題

問(wèn)題setProperty后未調(diào)用store,修改未保存到文件。

原因Properties是內(nèi)存中的對(duì)象,setProperty僅修改內(nèi)存數(shù)據(jù),需調(diào)用store才能寫(xiě)入文件。

解決方案

  • 修改后必須調(diào)用store方法,否則修改不會(huì)持久化:
props.setProperty("jdbc.url", "新URL");
// 必須調(diào)用store才能保存到文件
props.store(new FileOutputStream("db.properties"), "更新URL");

總結(jié)

properties文件和Properties類(lèi)是Java中輕量級(jí)配置解決方案:

  1. 簡(jiǎn)單易用:鍵值對(duì)格式和Properties類(lèi)的API都非常直觀,學(xué)習(xí)成本低;
  2. 靈活通用:適用于各種場(chǎng)景(數(shù)據(jù)庫(kù)配置、系統(tǒng)參數(shù)、框架配置等);
  3. 無(wú)縫集成:與Java及主流框架(Spring、MyBatis)完美兼容;
  4. 便于維護(hù):配置與代碼分離,修改配置無(wú)需重新編譯程序。

在實(shí)際開(kāi)發(fā)中,需注意編碼問(wèn)題(尤其是中文)和路徑問(wèn)題(確保文件能被正確讀取),對(duì)于復(fù)雜配置(如嵌套結(jié)構(gòu)),可考慮JSON或XML,但properties文件仍是簡(jiǎn)單配置的首選。

到此這篇關(guān)于Java中Properties類(lèi)和properties文件的文章就介紹到這了,更多相關(guān)Java Properties類(lèi)和properties文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JAVA Spring Boot 自動(dòng)配置實(shí)現(xiàn)原理詳解

    JAVA Spring Boot 自動(dòng)配置實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了詳解SpringBoot自動(dòng)配置原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-09-09
  • 聊聊Spring data jpa @query使用原生SQl,需要注意的坑

    聊聊Spring data jpa @query使用原生SQl,需要注意的坑

    這篇文章主要介紹了Spring data jpa@query使用原生SQl,需要注意的坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • spring security如何擴(kuò)展自定義登錄

    spring security如何擴(kuò)展自定義登錄

    本文詳細(xì)介紹了Spring Security的認(rèn)證原理和具體實(shí)現(xiàn),認(rèn)證原理基于過(guò)濾器鏈,通過(guò)驗(yàn)證用戶(hù)憑證和構(gòu)建認(rèn)證對(duì)象來(lái)保護(hù)應(yīng)用程序資源,實(shí)現(xiàn)自定義認(rèn)證功能的步驟包括創(chuàng)建自定義認(rèn)證提供程序、實(shí)現(xiàn)UserDetailsService接口以及在配置類(lèi)中進(jìn)行相應(yīng)的配置
    2024-11-11
  • Java面試題之this 和 super 的區(qū)別解析

    Java面試題之this 和 super 的區(qū)別解析

    this 和 super 雖然都是Java中的關(guān)鍵字,但它們的作用和使用場(chǎng)景有著明顯的區(qū)別,下面給大家介紹Java面試題之this 和 super 的區(qū)別解析,感興趣的朋友一起看看吧
    2025-05-05
  • Mybatis Plus框架項(xiàng)目落地實(shí)踐分析總結(jié)

    Mybatis Plus框架項(xiàng)目落地實(shí)踐分析總結(jié)

    這篇文章主要為大家介紹了Mybatis Plus框架項(xiàng)目落地實(shí)踐分析總結(jié),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • AndroidHttpClient使用Cookie應(yīng)用分析

    AndroidHttpClient使用Cookie應(yīng)用分析

    今天想把一個(gè)用使用了HttpClient的自動(dòng)簽到小程序移植到Android上,還好Android的SDK自帶了HttpClient的包.當(dāng)然也可以繼續(xù)使用DefaultHttpClient,但用為Android定制的AndroidHttpClient自然更好
    2012-11-11
  • springboot 中 druid+jpa+MYSQL數(shù)據(jù)庫(kù)配置過(guò)程

    springboot 中 druid+jpa+MYSQL數(shù)據(jù)庫(kù)配置過(guò)程

    這篇文章主要介紹了springboot 中 druid+jpa+MYSQL數(shù)據(jù)庫(kù)配置,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • SpringBoot使用@Cacheable時(shí)設(shè)置部分緩存的過(guò)期時(shí)間方式

    SpringBoot使用@Cacheable時(shí)設(shè)置部分緩存的過(guò)期時(shí)間方式

    這篇文章主要介紹了SpringBoot使用@Cacheable時(shí)設(shè)置部分緩存的過(guò)期時(shí)間方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java超詳細(xì)分析講解哈希表

    Java超詳細(xì)分析講解哈希表

    哈希表是一種根據(jù)關(guān)鍵碼去尋找值的數(shù)據(jù)映射結(jié)構(gòu),該結(jié)構(gòu)通過(guò)把關(guān)鍵碼映射的位置去尋找存放值的地方,說(shuō)起來(lái)可能感覺(jué)有點(diǎn)復(fù)雜,我想我舉個(gè)例子你就會(huì)明白了,最典型的的例子就是字典
    2022-06-06
  • 使用IDEA搭建MyBatis環(huán)境詳細(xì)過(guò)程

    使用IDEA搭建MyBatis環(huán)境詳細(xì)過(guò)程

    這篇文章主要介紹了使用IDEA搭建MyBatis環(huán)境的相關(guān)知識(shí),包括創(chuàng)建項(xiàng)目的過(guò)程及導(dǎo)入mybatis的核心jar包的詳細(xì)說(shuō)明,本文通過(guò)圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-05-05

最新評(píng)論

宁都县| 措美县| 都兰县| 呼伦贝尔市| 云梦县| 莒南县| 绥化市| 米泉市| 鹤壁市| 珲春市| 砚山县| 株洲县| 定日县| 寿阳县| 崇义县| 沈丘县| 勃利县| 鹤庆县| 同德县| 庆云县| 垦利县| 阳江市| 赤壁市| 南城县| 即墨市| 临澧县| 武城县| 鄂托克旗| 镇沅| 秀山| 佳木斯市| 黄梅县| 七台河市| 大田县| 新绛县| 临夏市| 基隆市| 花莲县| 郴州市| 陇西县| 金坛市|