ResourceBundle和native2ascii的使用介紹(Java)

在程式中把字串寫死是非常不好的作法

因為若要修改的話需要進到程式碼裡面去修改

且若在多個檔案裡面有相同的字串,要修改的話哪怕有幾百個檔案,都要逐一進去修改

為了避免這樣的情況,通常會有兩種做法

一種是建立字串工具類別(StringUtil)

一個是將字串寫在外部的檔案(如config檔、xml檔、properties檔……等)

這樣做的好處是以後要修改字串時,只要進到單一一個檔案進行修改即可

其他程式檔完全不需要動,大大降低修改所需的時間。

 

而這兩種做法有什麼差別呢?

字串工具類別通常會將程式內部會用到的字串,寫在該類別當作屬性(通常是一個靜態屬性)

而寫在外部檔案的作法,則是將環境參數(如參數設定值、路徑、API位置、DB連線字串、帳號密碼……等敏感資訊)寫在裡面

只要該檔案沒有外流,就算整碗程式碼被端走也較沒關係。

 

所以接下來要簡單介紹,在Java中引用外部的properties檔案,取得裡面設定的字串

 

首先先貼上test.properties檔

greeting=Hello
name=Leon
server.ip=127.0.0.1
server.name=localhost

properties檔的資料是以key、value的型式撰寫

等號前面為key值,後面為value值

key值不限格式,只要是等號前面的東西全部都算是key值

 

接下來則是在程式碼內的應用:

import java.util.ResourceBundle;

public class Test {

    public static void main(String[] args) {        

         //利用靜態方法取得實例,括號內需傳入properties的主檔名
         ResourceBundle resBundle = ResourceBundle.getBundle("test");        

         //使用getString取得字串,括號內傳入key值便會回傳value值
         System.out.println(resBundle.getString("greeting") + "! " + resBundle.getString("name") + "!");
         System.out.println("IP位置 : " + resBundle.getString("server.ip"));
         System.out.println("使用者名稱 : " + resBundle.getString("server.name"));
    }

}

輸出結果

Hello! Leon!
IP位置 : 127.0.0.1
使用者名稱 : localhost

這樣以後若要修改字串的話,只需要進到test.properties進行修改便可以了

 

但,如果開啟編輯器輸入中文的話,會發現執行結果變成亂碼:

greeting=安安
name=Leon
server.ip=127.0.0.1
server.name=localhost

執行結果:

??????! Leon!
IP位置 : 127.0.0.1
使用者名稱 : localhost

 

會造成這樣的情況,是因為Java版本的問題

JVM在載入.class檔時,是使用Unicode編碼去讀取與輸出字串

而properties檔的編碼是ISO-8859-1(能與Unicode對應的一種編碼),若輸入ISO-8859-1以外的字元就會出錯

必須將該字元轉成Unicode才能順利取得正確的值

而Java9以後的properties檔支援UTF-8,所以能直接在properties檔輸入中文

所以將test.properties改為:

greeting=\u4F60\u597D
name=Leon
server.ip=127.0.0.1
server.name=localhost

輸出結果:

你好! Leon!
IP位置 : 127.0.0.1
使用者名稱 : localhost

 

現在eclipse會自動將properties裡輸入的中文轉成unicode編碼

若是使用文字檔編輯的話,可以利用native2ascii工具轉換。

做法為先在一般的文字編輯器裡寫好內容,但須注意該編輯器是使用哪種編碼

在上圖中可以看到右下角顯示編碼為UTF-8

接下來在cmd內輸入指令

native2ascii -encoding 編輯器編碼 文字檔檔名 目標properties檔名

所以這裡我要輸入

native2ascii –encoding utf-8 test.txt test.properties

native2ascii工具就會將test.txt的內容用unicode編碼轉換成test.properties

輸出結果為:

greeting=\u6211\u662f\u5de5\u7a0b\u5e2b

 

若要將test.properties的內容還原的話,可以加上-reverse引數,指令為

native2ascii -reverse -encoding 編輯器編碼 properties檔名 目標文字檔檔名

所以這裡輸入

native2ascii -reverse -encoding utf-8 test.properties testing.txt

輸出結果為

透過這個工具,就不必上網去找轉碼的網頁了

不過由於Java9後的properties檔支援UTF-8,所以這個工具也就被移除了