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

时间:2014-02-02 22:49:15

标签: groovy escaping

我有类似的东西:

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'

有没有解决方法呢?将未转义的key = value格式保存到Groovy中的属性文件?

2 个答案:

答案 0 :(得分:5)

你可以这样做:

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阅读属性,就不需要这样做,因为它应该撤消任何转义字符

答案 1 :(得分:1)

JDK内置的Properties类可以通过设计逃脱。根据{{​​3}}:

  

然后写出这个Properties表中的每个条目,每个条目一个   线。对于每个条目,写入密钥字符串,然后是ASCII =   关联的元素字符串。对于密钥,所有空格字符都是   用前面的\字符写。对于元素,领先的空间   写入字符,但不写入嵌入或尾随空格字符   带有前面的\字符。键和元素字符#,!,=,   和:用前面的反斜杠写成,以确保它们是   装好了。

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