从文件读取字符串时Kotlin字符串替换不起作用

时间:2018-09-05 07:01:25

标签: kotlin

我写了一个读取文本文件的代码。文本文件包含我要替换的占位符。替换无法以这种方式工作,并且字符串将使用占位符打印。这是我为此编写的代码:

class TestSub(val sub: Sub) {

    fun create() = template()

    fun template() = Files.newBufferedReader(ClassPathResource(templateId.location).file.toPath()).readText()
}

data class Sub(val name: String, val age: Int)

这是尝试打印最终字符串的主要功能:

fun main(args: Array<String>) {
    val sub = Sub("Prashant", 32)

    println(TestSub(sub).create())
}

但是,当我使用字符串而不是读取文件时,以下代码有效(替换fun template()

fun template() = "<h1>Hello ${sub.name}. Your age is ${sub.age}</h1>"

读取文件内容时是否有办法使字符串替换工作?

3 个答案:

答案 0 :(得分:3)

Kotlin不支持文件中的字符串模板。即像"some variable: $variable"这样的 code 会被编译为"some variable: " + variable。字符串模板是在编译时处理的,这意味着它不适用于从文件加载的文本,或者如果您执行其他操作以使字符串转义为原始格式,则该模板将不起作用。无论哪种方式,正如danielspaniol所述,这都是安全威胁。

留下三个选项:

  • String.format(str)
  • MessageFormat.format(str)
  • 创建自定义引擎

我不知道您的文件包含什么,但是如果它是您在模板函数中使用的String,请将其更改为:

<h1>Hello {0}. Your age is {1,integer}</h1>

这是给MessageFormat的,这是我个人的偏爱。如果使用String.format,请改用%s和其他适当的格式。

现在,在MessageFormat.format中使用它:

val result = MessageFormat.format(theString, name, age);

请注意,如果您使用MessageFormat,则需要将'转换为''。参见this

答案 1 :(得分:1)

使用${...}进行字符串替换是字符串文字语法的一部分,并且大致像这样

val a = 1
val b = "abc ${a} def"  // gets translated to something like val b = "abc " + a + " def"

因此,当您从文本文件加载时,此方法将无法工作。这也将带来巨大的安全风险,因为它将允许任意代码执行。

但是我认为Kotlin具有类似sprintf的功能,您可以在字符串中使用类似%s的占位符,并可以将其替换为值


看看here。看起来最简单的方法是使用String.format

答案 2 :(得分:0)

字符串模板仅适用于编译时Sting文字,而您从文件中读取的内容则在运行时生成。

您需要一个模板引擎,该引擎可以在运行时呈现带有变量或模型的模板。

在简单的情况下,Java中的String.formatMessageFormat.format可以使用。

对于复杂的情况,请检查胸腺叶,速度等。