溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java property 配置文件管理工具框架,避免寫入 property 亂序

發(fā)布時間:2020-07-03 07:52:15 來源:網(wǎng)絡(luò) 閱讀:137162 作者:葉止水ryo 欄目:編程語言

property

property 是 java 實現(xiàn)的 property 框架。

特點

  • 優(yōu)雅地進(jìn)行屬性文件的讀取和更新

  • 寫入屬性文件后屬性不亂序

  • 靈活定義編碼信息

  • 使用 OO 的方式操作 property 文件

  • 支持多級對象引用

變更日志

ChangeLog

快速開始

環(huán)境依賴

Maven 3.x

Jdk 1.7+

Maven 引入依賴

<dependency>
    <groupId>com.github.houbb</groupId>
    <artifactId>property</artifactId>
    <version>0.0.4</version>
</dependency>

入門案例

讀取屬性

PropertyBs.getInstance("read.properties").get("hello");

read.properties 為文件路徑,hello 為存在的屬性值名稱。

讀取屬性指定默認(rèn)值

final String value = PropertyBs.getInstance("read.properties")
                .getOrDefault("hello2", "default");

read.properties 為文件路徑,hello2 為不存在的屬性值名稱,default 為屬性不存在時返回的默認(rèn)值。

設(shè)置屬性

PropertyBs.getInstance("writeAndFlush.properties").setAndFlush("hello", "world-set");

writeAndFlush.properties 為文件路徑,hello 為需要設(shè)置的屬性信息。

引導(dǎo)類方法概覽

序號 方法 說明
1 getInstance(propertyPath) 獲取指定屬性文件路徑的引導(dǎo)類實例
2 charset(charset) 指定文件編碼,默認(rèn)為 UTF-8
3 get(key) 獲取 key 對應(yīng)的屬性值
4 getOrDefault(key, defaultValue) 獲取 key 對應(yīng)的屬性值,不存在則返回 defaultValue
5 set(key, value) 設(shè)置值(內(nèi)存)
6 remove(key) 移除值(內(nèi)存)
7 flush() 刷新內(nèi)存變更到當(dāng)前文件磁盤
9 flush(path) 刷新內(nèi)存變更到指定文件磁盤
10 set(map) 設(shè)置 map 信息到內(nèi)存
11 set(bean) 設(shè)置 bean 對象信息到內(nèi)存
12 asMap() 返回內(nèi)存中屬性信息,作為 Map 返回
13 asBean(bean) 返回內(nèi)存中屬性信息到 bean 對象中

對象

簡介

我們希望操作 property 可以想操作對象一樣符合 OO 的思想。

設(shè)置值

User user = new User();
user.setName("hello");
user.setHobby("hobby");

final long time = 1574147668411L;
user.setBirthday(new Date(time));

PropertyBs propertyBs = PropertyBs.getInstance("setBean.properties")
        .set(user);

Assert.assertEquals("hobby", propertyBs.get("myHobby"));
Assert.assertEquals("1574147668411", propertyBs.get("birthday"));

讀取值

PropertyBs propertyBs = PropertyBs.getInstance("setBean.properties"
        .set("myHobby", "play")
        .set("birthday", "1574147668411");
User user = new User();
propertyBs.asBean(user);
Assert.assertEquals("play", user.getHobby());
Assert.assertEquals(1574147668411L, user.getBirthday().getTime());

對象定義

  • User.java
public class User {

    private String name;

    @PropertyField("myHobby")
    private String hobby;

    @PropertyField(converter = DateValueConverter.class)
    private Date birthday;

}

@PropertyField 注解

序號 屬性 默認(rèn)值 說明
1 value 當(dāng)前字段名稱 對應(yīng)的 property 屬性名稱
2 converter 默認(rèn)轉(zhuǎn)換實現(xiàn) DefaultValueConverter 對當(dāng)前字段進(jìn)行屬性的轉(zhuǎn)換處理

自定義轉(zhuǎn)換類

  • DateValueConverter.java

這個就是我們針對 Date 類型,自己實現(xiàn)的處理類型。

實現(xiàn)如下:

public class DateValueConverter implements IValueConverter {

    @Override
    public Object fieldValue(String value, IFieldValueContext context) {
        return new Date(Long.parseLong(value));
    }

    @Override
    public String propertyValue(Object value, IPropertyValueContext context) {
        Date date = (Date)value;
        return date.getTime()+"";
    }

}

集合

說明

有時候一個屬性可能是集合或者數(shù)組,這里暫時給出比較簡單的實現(xiàn)。

將字段值直接根據(jù)逗號分隔,作為屬性值。

測試案例

UserArrayCollection userArrayCollection = buildUser();
PropertyBs propertyBs = PropertyBs.getInstance("setBeanArrayCollection.properties")
        .set(userArrayCollection);
Assert.assertEquals("array,collection", propertyBs.get("alias"));
Assert.assertEquals("array,collection", propertyBs.get("hobbies"));

對象定義

  • UserArrayCollection.java
public class UserArrayCollection {

    private List<String> alias;

    private String[] hobbies;
}

暫時只支持 String 類型,不想做的過于復(fù)雜。

后期將考慮添加各種類型的支持。

多級對象

說明

有時候我們在一個對象中會引用其他對象,比如 對象 a 中包含對象 b。

這里采用 a.b.c 這種方式作為屬性的 key, 更加符合使用的習(xí)慣。

測試案例

設(shè)置

Book book = new Book();
book.name("《海底兩萬里》").price("12.34");
UserEntry user = new UserEntry();
user.name("海倫").book(book).age("10");
PropertyBs propertyBs = PropertyBs.getInstance("setBeanEntry.properties")
        .set(user);
Assert.assertEquals("海倫", propertyBs.get("name"));
Assert.assertEquals("10", propertyBs.get("age"));
Assert.assertEquals("《海底兩萬里》", propertyBs.get("book.name"));
Assert.assertEquals("12.34", propertyBs.get("book.price"));

讀取

Map<String, String> map = new HashMap<>();
map.put("name", "海倫");
map.put("age", "10");
map.put("book.name", "《海底兩萬里》");
map.put("book.price", "12.34");
UserEntry userEntry = new UserEntry();
PropertyBs.getInstance("setBeanEntry.properties")
        .set(map)
        .asBean(userEntry);
Assert.assertEquals("UserEntry{name='海倫', age=10, book=Book{name='《海底兩萬里》', price=12.34}}",
        userEntry.toString());

對象定義

  • UserEntry.java
public class UserEntry {

    private String name;

    private String age;

    @PropertyEntry
    private Book book;

}
  • Book.java
public class Book {

    private String name;

    private String price;

}

@PropertyEntry 說明

@PropertyEntry 注解用來標(biāo)識一個字段是否采用多級對象的方式表示。

這個注解只有一個屬性,就是 value(),可以用來給當(dāng)前字段指定一個別稱,和 @PropertyField 別稱類似。

后續(xù)特性

  • 提供更多內(nèi)置的類型轉(zhuǎn)換實現(xiàn)
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI