在程式中把字串寫死是非常不好的作法
因為若要修改的話需要進到程式碼裡面去修改
且若在多個檔案裡面有相同的字串,要修改的話哪怕有幾百個檔案,都要逐一進去修改
為了避免這樣的情況,通常會有兩種做法
一種是建立字串工具類別(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,所以這個工具也就被移除了