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

总结

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

相关文章

  • 多个SpringBoot项目采用redis实现Session共享功能

    多个SpringBoot项目采用redis实现Session共享功能

    这篇文章主要介绍了多个SpringBoot项目采用redis实现Session共享,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • jfinal添加jcaptcha验证码实现方法

    jfinal添加jcaptcha验证码实现方法

    这篇文章主要介绍了jfinal的jcaptcha验证码实现方法,大家参考使用吧
    2014-01-01
  • 剑指Offer之Java算法习题精讲求和篇

    剑指Offer之Java算法习题精讲求和篇

    跟着思路走,之后从简单题入手,反复去看,做过之后可能会忘记,之后再做一次,记不住就反复做,反复寻求思路和规律,慢慢积累就会发现质的变化
    2022-03-03
  • Java中的SPI机制案例分享

    Java中的SPI机制案例分享

    这篇文章主要介绍了Java中的SPI机制案例分享,文章基于Java的相关资料展开SPI的详细介绍,SPI的全称是Service Provider Interface,服务提供者接口,下文更多相关内容介绍需要的小伙伴可以参考一下
    2022-04-04
  • 实例详解SpringBoot默认的JSON解析方案

    实例详解SpringBoot默认的JSON解析方案

    JSON数据现在是我们开发中用的最多的,百分之九十的数据都是通过JSON方式进行传输,下面这篇文章主要给大家介绍了关于SpringBoot默认的JSON解析方案的相关资料,需要的朋友可以参考下
    2021-08-08
  • 详解在Spring Boot中使用Mysql和JPA

    详解在Spring Boot中使用Mysql和JPA

    本文向你展示如何在Spring Boot的Web应用中使用Mysq数据库,也充分展示Spring Boot的优势
    2017-04-04
  • Java实现二分查找的变种

    Java实现二分查找的变种

    这篇文章主要为大家详细介绍了Java实现二分查找的变种,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • elasticsearch中term与match的区别讲解

    elasticsearch中term与match的区别讲解

    今天小编就为大家分享一篇关于elasticsearch中term与match的区别讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • Java调用windows系统的CMD命令并启动新程序

    Java调用windows系统的CMD命令并启动新程序

    本文教你如何使用java程序调用windows系统的CMD命令启动新程序方法,需要的朋友可以参考下
    2023-05-05
  • JPA @Query时,无法使用limit函数的问题及解决

    JPA @Query时,无法使用limit函数的问题及解决

    这篇文章主要介绍了JPA @Query时,无法使用limit函数的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论