无需 unicode 转义即可读写 Java 属性

Posted

技术标签:

【中文标题】无需 unicode 转义即可读写 Java 属性【英文标题】:Read and Write Java Properties without unicode escapes 【发布时间】:2021-02-09 19:02:15 【问题描述】:

这个问题可能已经被问和回答了 100 次,但不幸的是我没有找到适合我的问题的任何东西。

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

例如 ":" 变成 "\:" 或 描述变为描述\u00F3n

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

非常感谢

这是我编写属性的代码:

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

【问题讨论】:

请详细说明您打算用它实现什么。 load()store()- 方法可以很好地协同工作并正确处理任何编码问题。虽然您绝对可以编写自己的方法来加载和存储数据,但它很可能只会增加很多编码问题。您想将该文件用于与您的 java 程序不同的目的吗?如果有,是哪个? 感谢您的快速回放。如果特殊字符被转义但“不应更改特殊字符!”,它仍然可以正常工作。是我得到的声明,所以我想找到一种方法来编写没有大错误来源的属性并且不逃避特殊字符很多工作没有什么好处......但我必须做老板想要的...... 【参考方案1】:

您可以使用 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) 
    // ...

【讨论】:

【参考方案2】:

我用自定义编写器方法解决了这个问题:

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

  

【讨论】:

以上是关于无需 unicode 转义即可读写 Java 属性的主要内容,如果未能解决你的问题,请参考以下文章

“全栈2019”Java第十五章:Unicode与转义字符

Unicode与ASCiI之间有什么区别?java当中的转义字符 Character类的使用 String类的使用

Unicode转义(uXXXX)的编码和解码

Unicode转义(uXXXX)的编码和解码

Python unicode转义字符u的处理

java的转义字符