Kotlin 中的 String 属性可以有多长?

kli*_*mat 5 base64 android kotlin

我创建了简单的Base64Images辅助类,其中包含此主体:

companion object{
  val ABSTRACT_COLORS = "[image encoded in base64]"
}
Run Code Online (Sandbox Code Playgroud)

ABSTRACT_COLORS实际上是一个有 570438 个字符的字符串。

在编译过程中我得到:

org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Failed to generate property ABSTRACT_COLORS
...
...
The root cause was thrown at: ByteVector.java:213 at org.jetbrains.kotlin.codegen.MemberCodegen.genFunctionOrProperty(MemberCodegen.java:205)
Caused by: java.lang.IllegalArgumentException
Run Code Online (Sandbox Code Playgroud)

我认为我可以在字符串中存储2147483647 (2 31 - 1) 个字符。

这是为什么?

我在下面发布了这张图片。
您可以使用此工具生成base64。

提示:编辑此类或编译项目会冻结 Android Studio。
我会使用一些轻量级编辑器来编辑并使用终端来编译它。

在此输入图像描述

Jay*_*ard 4

正如 @mfulton26 的评论中提到的,加载字符串时编译器发生了一些事情。应向Kotlin 问题跟踪器报告的崩溃错误。

作为解决方法,您可以将其添加为src/main/resources目录中的文件,并将字符串动态加载为 aStringByteArray.

例如,如果文件是,src/main/resources/abstract-colors.txt您可以将整个文件读入字符串

val ABSTRACT_COLORS = javaClass.getResourceAsStream("/abstract-colors.txt")
                               .bufferedReader().use { it.readText() }
Run Code Online (Sandbox Code Playgroud)

如果您不需要对其进行 Base64 编码,您可以将图像存储为二进制并将其读入ByteArray.

val ABSTRACT_COLORS = javaClass.getResourceAsStream("/abstract-colors.jpg")
                               .use { it.readBytes() }
Run Code Online (Sandbox Code Playgroud)