如何在没有转义字符和单引号的情况下在 Groovy 中编写属性文件?

Posted

技术标签:

【中文标题】如何在没有转义字符和单引号的情况下在 Groovy 中编写属性文件?【英文标题】:How to write properties file in Groovy without escape characters and single quotes? 【发布时间】:2014-02-26 08:17:33 【问题描述】:

我有类似的东西:

def newProps = new Properties()
def fileWriter = new OutputStreamWriter(new FileOutputStream(propsFile,true), 'UTF-8')
def lineSeparator = System.getProperty("line.separator")

newProps.setProperty('SFTP_USER_HASH', userSftpHome.toString())
newProps.setProperty('GD_SFTP_URI', sftpHost.toString())

fileWriter.write(lineSeparator)
newProps.store(fileWriter, null)
fileWriter.close()

问题是 store() 方法用反斜杠 () 转义了 ":""=" 字符。我不希望这样,因为我在那里存储了一些密码和令牌,并且需要严格以 key=value 格式复制这些值。

另外,当我使用 configSlurper 时,它会用单引号存储值,例如:

key='value'

有什么解决办法吗?以非转义键 = 值格式保存到 Groovy 中的属性文件?

【问题讨论】:

【参考方案1】:

你可以这样做:

def newProps = new Properties()
newProps.setProperty('SFTP_USER_HASH', 'woo')
newProps.setProperty('GD_SFTP_URI', 'ftp://woo.com')

propsFile.withWriterAppend( 'UTF-8' )  fileWriter ->
    fileWriter.writeLine ''
    newProps.each  key, value ->
        fileWriter.writeLine "$key=$value"
    

但是,只要您使用load 读取属性,就不需要这样做,因为它应该对任何转义字符进行转义

【讨论】:

【参考方案2】:

JDK 内置的Properties 类通过设计实现了转义。根据Docs:

然后写出此属性表中的每个条目,每个条目 线。对于每个条目,写入密钥字符串,然后是 ASCII =,然后 关联的元素字符串。对于键,所有空格字符都是 用前面的 \ 字符编写。对于元素,前导空格 字符,但不是嵌入或尾随空格字符,被写入 带有前面的 \ 字符。键和元素字符#、!、=、 和 : 用前面的反斜杠编写,以确保它们是 正确加载。

但是,您可以通过自己对 Properties 类进行子类化来覆盖此行为。您需要自己覆盖 loadstore 方法并自己读/写。这将非常简单。在这里找到了很好的例子:Link

【讨论】:

以上是关于如何在没有转义字符和单引号的情况下在 Groovy 中编写属性文件?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript - 如何在 Kendo 模板上转义双引号和单引号

在 Xpath 中同时转义双引号和单引号

SQL双引号和单引号同时存在的时候该如何转义呢? 比如这一句

有没有办法在 bash 中一起转义 $ 和单引号?

PHP字符串定义方式和单引号双引号的区别

Perl双引号和单引号的区别