Java读取Properties文件时保持顺序的解决过程
作者:大大怪~将军
文章讲述了解决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);总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
