Java讀取Properties文件時保持順序的解決過程
更新時間:2025年11月10日 08:54:57 作者:大大怪~將軍
文章講述了解決Java中Properties文件讀取時中文亂碼問題的幾種方法,包括重寫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 讀取的國際化的文件內容順序顯示
*/
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);總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
VS?Code插件Language?Support?for?Java(TM)?by?Red?Hat報錯兩種
這篇文章主要介紹了VS?Code插件Language?Support?for?Java(TM)?by?Red?Hat報錯兩種解決辦法的相關資料,第一種在setting.json中配置使用新版本JDK運行,第二種方法是切換至支持舊版本Jdk的插件版本,但不推薦,建議要確保使用最新JDK以避免兼容性問題,需要的朋友可以參考下2026-04-04
SpringBoot中攔截器和動態(tài)代理的區(qū)別詳解
在?Spring?Boot?中,攔截器和動態(tài)代理都是用來實現功能增強的,所以在很多時候,有人會認為攔截器的底層是通過動態(tài)代理實現的,所以本文就來盤點一下他們兩的區(qū)別,以及攔截器的底層實現吧2023-09-09
30w+數據使用RedisTemplate?pipeline空指針NullPointerException異常分析
這篇文章主要為大家介紹了30w+數據使用RedisTemplate?pipeline空指針NullPointerException異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08

