Java讀取Properties文件時(shí)保持順序的解決過程
更新時(shí)間:2025年11月10日 08:54:57 作者:大大怪~將軍
文章講述了解決Java中Properties文件讀取時(shí)中文亂碼問題的幾種方法,包括重寫Properties的put方法、拓展記錄解決ResourceBundle讀取properties中文亂碼問題等
1、解決方法
Properties props = new LinkedProperties();
try (InputStream is = resource.getInputStream()) {
props.load(new InputStreamReader(is, StandardCharsets.UTF_8)); // 保證UTF-8讀取
}
Map<String, String> messages = new LinkedHashMap<>();
for (String key : props.stringPropertyNames()) {
messages.put(key, props.getProperty(key));
}2、重寫Properties 的put方法
import org.jetbrains.annotations.NotNull;
import java.util.*;
/**
* 重寫Properties 的put 方法,為了讓 LinkedProperties 讀取的國際化的文件內(nèi)容順序顯示
*/
public class LinkedProperties extends Properties {
private static final long serialVersionUID = 1L;
private final LinkedHashSet<Object> keys = new LinkedHashSet<>();
@Override
public synchronized Object put(Object key, Object value) {
keys.add(key);
return super.put(key, value);
}
@Override
public Set<String> stringPropertyNames() {
Set<String> set = new LinkedHashSet<>();
for (Object obj : keys) {
set.add((String) obj);
}
return set;
}
@NotNull
@Override
public Set<Object> keySet() {
return this.keys;
}
@Override
public Enumeration<Object> keys() {
return Collections.enumeration(keys);
}
}
3、拓展記錄
解決 ResourceBundle 讀取properties 中文亂碼問題
import org.jetbrains.annotations.NotNull;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class UTF8Control extends ResourceBundle.Control {
@Override
public ResourceBundle newBundle(String baseName, Locale locale, String format,
ClassLoader loader, boolean reload)
throws IllegalAccessException, InstantiationException, IOException {
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, "properties");
try (InputStream stream = loader.getResourceAsStream(resourceName)) {
if (stream == null) return null;
try (InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) {
Properties props = new Properties();
props.load(reader);
return new ResourceBundle() {
@Override
protected Object handleGetObject(@NotNull String key) {
return props.getProperty(key);
}
@NotNull
@Override
public Enumeration<String> getKeys() {
return Collections.enumeration(props.stringPropertyNames());
}
};
}
}
}
}
4、使用
// ResourceBundle bundle = ResourceBundle.getBundle(baseName, new UTF8Control());
// Map<String, String> messages = new ConcurrentHashMap<>();
// for (String key : bundle.keySet()) {
// messages.put(key, bundle.getString(key));
// }
// cachedMessages.put(bundle.getLocale(), messages);總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中Object類常用的12個(gè)方法(小結(jié))
Java 中的 Object 方法在面試中是一個(gè)非常高頻的點(diǎn),本文主要介紹了Java中Object類常用的12個(gè)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
VS?Code插件Language?Support?for?Java(TM)?by?Red?Hat報(bào)錯(cuò)兩種
這篇文章主要介紹了VS?Code插件Language?Support?for?Java(TM)?by?Red?Hat報(bào)錯(cuò)兩種解決辦法的相關(guān)資料,第一種在setting.json中配置使用新版本JDK運(yùn)行,第二種方法是切換至支持舊版本Jdk的插件版本,但不推薦,建議要確保使用最新JDK以避免兼容性問題,需要的朋友可以參考下2026-04-04
SpringBoot中攔截器和動態(tài)代理的區(qū)別詳解
在?Spring?Boot?中,攔截器和動態(tài)代理都是用來實(shí)現(xiàn)功能增強(qiáng)的,所以在很多時(shí)候,有人會認(rèn)為攔截器的底層是通過動態(tài)代理實(shí)現(xiàn)的,所以本文就來盤點(diǎn)一下他們兩的區(qū)別,以及攔截器的底層實(shí)現(xiàn)吧2023-09-09
Java數(shù)據(jù)結(jié)構(gòu)中圖的進(jìn)階詳解
在Java學(xué)習(xí)與應(yīng)用中,數(shù)據(jù)結(jié)構(gòu)無疑是每個(gè)人都要接觸的難點(diǎn),為了更好的學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)這一塊內(nèi)容,用圖來理解便是最好的方式,讓我們一起來了解本篇內(nèi)容圖的進(jìn)階2022-01-01
30w+數(shù)據(jù)使用RedisTemplate?pipeline空指針NullPointerException異常分析
這篇文章主要為大家介紹了30w+數(shù)據(jù)使用RedisTemplate?pipeline空指針NullPointerException異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08

