java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java读取Properties文件时保持顺序

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);

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文