解决“对于常量池来说, 字符串 "..." 的 UTF8 表示过长”以及读取properties中文乱码的问题

  1. 用IDEA写程序时碰到了一个问题,读取写在常量类中的一个字符串时发生了错误
Error:(6, 8) java: 对于常量池来说, 字符串 "{"actualCapital":"",..." 的 UTF8 表示过长

网上查了一下,是这个字符串的大小超过了65535个字节,也就是64K。的确,我的这个字符串长度大概是94K,超过了64K。
2. 解决方法:把这个字符串从常量类中挪到properties文件中。
* 在resource下面新加一个json.properties文件,然后把大字符串写到这个文件中

json=[大字符串]
  1. 但是这又引出了另外一个问题:中文字符在properties文件中读取出来后变成了乱码,网上找了很多方法,设置编码解码格式等,也没有解决。后来终于找到了解决方法,就是把字符串粘贴进properties文件中前,先进行ASCII–>NATIVE转码,转码完成后写进去,再从里面读出来,中文就正常了。转码有很多工具,这里贴一个网站:
http://tool.chinaz.com/tools/native_ascii.aspx

勾选“不转换字母和数字”,点击ASCII转NATIVE按钮即可
4. 同时附上一个简单的从properties中读取数据的方法

/**
 * 从指定的配置文件里面根据指定的key读取value
 * @param propertiesPath 配置文件地址
 * @param key            key值
 * @param defaultValue   如果该key没有找到,则返回的默认值
 * @return value值
 */
public static String readFromProperties(String propertiesPath, String key, String defaultValue) {

    try {
        Properties properties = new Properties();
        InputStream in = GraphresysServiceImpl.class.getResourceAsStream(propertiesPath);
        properties.load(in);
        in.close();
        if (properties.containsKey(key)) {
            return properties.getProperty(key);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return defaultValue;

}

你可能感兴趣的:(java)