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

总结

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

相关文章

  • Java之SpringCloud nocos注册中心讲解

    Java之SpringCloud nocos注册中心讲解

    这篇文章主要介绍了Java之SpringCloud nocos注册中心讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java中Object类常用的12个方法(小结)

    Java中Object类常用的12个方法(小结)

    Java 中的 Object 方法在面试中是一个非常高频的点,本文主要介绍了Java中Object类常用的12个方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • VS Code插件Language Support for Java(TM) by Red Hat报错两种解决办法

    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中拦截器和动态代理的区别详解

    SpringBoot中拦截器和动态代理的区别详解

    在 Spring Boot 中,拦截器和动态代理都是用来实现功能增强的,所以在很多时候,有人会认为拦截器的底层是通过动态代理实现的,所以本文就来盘点一下他们两的区别,以及拦截器的底层实现吧
    2023-09-09
  • idea如何开启菜单栏

    idea如何开启菜单栏

    文章介绍了如何通过修改IntelliJ IDEA的样式文件`ui.lnf.xml`来重新显示被关闭的菜单栏,并分享了解决问题的步骤
    2025-01-01
  • Java面向对象之内部类详解

    Java面向对象之内部类详解

    在 Java 中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。这篇文章将总结一下内部类的使用,感兴趣的可以了解一下
    2022-10-10
  • Java类初始化执行流程解析

    Java类初始化执行流程解析

    这篇文章主要介绍了Java类初始化执行流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • 解决jar包rar压缩后无法运行问题

    解决jar包rar压缩后无法运行问题

    这篇文章主要介绍了解决jar包rar压缩后无法运行问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java数据结构中图的进阶详解

    Java数据结构中图的进阶详解

    在Java学习与应用中,数据结构无疑是每个人都要接触的难点,为了更好的学习数据结构这一块内容,用图来理解便是最好的方式,让我们一起来了解本篇内容图的进阶
    2022-01-01
  • 30w+数据使用RedisTemplate pipeline空指针NullPointerException异常分析

    30w+数据使用RedisTemplate pipeline空指针NullPointerException异常分析

    这篇文章主要为大家介绍了30w+数据使用RedisTemplate pipeline空指针NullPointerException异常分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论