Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从文件中读取字符串时,Kotlin字符串替换不起作用_Kotlin - Fatal编程技术网

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

从文件中读取字符串时,Kotlin字符串替换不起作用,kotlin,Kotlin,我已经写了一段代码,可以读取文本文件。文本文件包含我要替换的占位符。替换不会以这种方式工作,字符串是用占位符打印的。以下是我为此编写的代码: class TestSub(val sub: Sub) { fun create() = template() fun template() = Files.newBufferedReader(ClassPathResource(templateId.location).file.toPath()).readText() } data

我已经写了一段代码,可以读取文本文件。文本文件包含我要替换的占位符。替换不会以这种方式工作,字符串是用占位符打印的。以下是我为此编写的代码:

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

在读取文件内容时,有没有办法使字符串替换工作?

使用
${…}
进行字符串替换是字符串文本语法的一部分,大致如下所示

val a = 1
val b = "abc ${a} def"  // gets translated to something like val b = "abc " + a + " def"
因此,当您从文本文件加载时,这是无法工作的。这也将是一个巨大的安全风险,因为它将允许任意代码执行

但是,我假设Kotlin有一个类似于
sprintf
的函数,您可以在字符串中包含
%s
之类的占位符,并且可以用值替换它们



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

字符串模板只适用于编译时的Sting文本,而从文件读取的内容是在运行时生成的

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

对于简单的情况,Java中的
String.format
MessageFormat.format
可以工作


对于复杂的情况,请检查thymeleaf、velocity等。

Kotlin不支持文件中的字符串模板。也就是说,code
“某个变量:$variable”
被编译成
“某个变量:”+variable
。字符串模板是在编译时处理的,这意味着它不能处理从文件加载的文本,或者如果您做了其他事情将字符串转义为原始形式。不管怎样,正如前面提到的那样,这将是一种安全威胁

剩下三种选择:

  • String.format(str)
  • MessageFormat.format(str)
  • 创建自定义引擎
我不知道您的文件包含什么,但如果它是您在模板函数中使用的字符串,请将其更改为:

<h1>Hello {0}. Your age is {1,integer}</h1>
请注意,如果使用
MessageFormat
,则需要将
转义为
'
。看

<h1>Hello {0}. Your age is {1,integer}</h1>
val result = MessageFormat.format(theString, name, age);