将UTF-8编码的Java字符串转换为属性(Properties)

12

我有一个单一的UTF-8编码字符串,其中包含键值对链,需要被加载到Properties对象中。我注意到我的初始实现出现了乱码字符,在一番搜索后,我找到了这个问题,指出了我的问题——基本上是因为Properties默认使用ISO-8859-1编码方式。这是我的原始实现:

public Properties load(String propertiesString) {
        Properties properties = new Properties();
        try {
            properties.load(new ByteArrayInputStream(propertiesString.getBytes()));
        } catch (IOException e) {
            logger.error(ExceptionUtils.getFullStackTrace(e));
        }
        return properties;
    }

没有指定编码,这就是我的问题。对于我的问题,我无法弄清如何链接/创建 Reader / InputStream 组合以传递给 Properties.load(),该组合使用提供的 propertiesString 并指定编码。我认为这主要是由于我在I / O流方面的经验不足以及java.io包中众多的IO实用程序库。

感谢任何建议。


Java属性UTF-8编码在Eclipse中是这个问题的更好解决方案。 - Vladislav Mikhalchuk
Java在Eclipse中的UTF-8编码属性对于这个问题来说,这是一个更好的解决方案。 - undefined
3个回答

13

在处理字符串时,请使用ReaderInputStream主要用于二进制数据。

public Properties load(String propertiesString) {
    Properties properties = new Properties();
    properties.load(new StringReader(propertiesString));
    return properties;
}

那个构造函数不存在。 - BalusC
谢谢,我确实查看了StringReader,但是我没有看到这样的构造函数。 - markdsievers
谢谢你的帮助,Matt。我已成功尝试了这个解决方案。一开始没有使用StringReader,因为我着眼于对编码的控制。非常感谢你的协助。给你点赞并接受作为我的朋友。 - markdsievers
非常欢迎。最初指向不存在的构造函数,对此表示歉意。 - Matt Ball

3
   private Properties getProperties() throws IOException {
        ClassLoader classLoader = getClass().getClassLoader();
        InputStream input = classLoader.getResourceAsStream("your file");
        InputStreamReader inputStreamReader = new InputStreamReader(input, "UTF-8");
        Properties properties = new Properties();
        properties.load(inputStreamReader);
        return properties;
    }

然后使用

System.out.println(getProperties().getProperty("key"))

1

试试这个:

ByteArrayInputStream bais = new ByteArrayInputStream(propertiesString.getBytes("UTF-8"));
properties.load(bais);

1
我不得不使用这个替代StringReader,以支持Android SDK版本低于android-9的设备。 - Hans-Christoph Steiner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接