读取和写入 Java 没有 unicode 转义的属性

Read and Write Java Properties without unicode escapes

这个问题可能已经被问到并回答了 100 次,但不幸的是我没有找到适合我的问题的内容。

以下情况:我遇到问题,当我读取属性更改它们然后再次写入时,所有特殊字符都是 unicode 转义的。

例如“:”变成“\:”或 描述变为 Descripci\u00F3n

有没有办法改变存储方法,使特殊字符不被转义?

非常感谢

这是我编写属性的代码:

  private static void writeUpdatedPropertiesFile(Properties newProperties, File sourceAndDestinationFile) {
    sourceAndDestinationFile.delete();
    try (FileOutputStream out = new FileOutputStream(sourceAndDestinationFile)) {
      newProperties.store(out, null);
    }
    catch (final IOException e) {
      e.printStackTrace();
    }
  }

您可以使用 store(Writer) 而不是 store(OutputStream)。您可以使用您希望的任何字符集构造一个 OutputStreamWriter:

try (Writer out = new BufferedWriter(
    new OutputStreamWriter(
        new FileOutputStream(sourceAndDestinationFile),
        StandardCharsets.UTF_8))) {

    newProperties.store(out, null);

} catch (IOException e) {
    e.printStackTrace();
}

当然,您有责任知道该文件是 UTF-8 文件,并使用 load(Reader) 而不是使用 InputStream:

来读取它
try (Reader in = new BufferedReader(
    new InputStreamReader(
        new FileInputStream(sourceAndDestinationFile),
        StandardCharsets.UTF_8))) {

    properties.load(in);
} catch (IOException e) {
    // ...
}

我用自定义编写器方法解决了它:

    private static void writeProperties(Properties properties, File destinationFile) {

    try (final BufferedWriter writer = new BufferedWriter(
        new OutputStreamWriter(new FileOutputStream(destinationFile), "Cp1252"))) {
      for (final Object o : properties.entrySet()) {
        final String keyValue = o.toString();
        writer.write(keyValue + "\r\n");
      }
    }
    catch (final IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

  }