2016-09-19 40 views
4

我创建简单Base64Images的辅助类,其中包含该机构:字符串属性可以在Kotlin中多久?

companion object{ 
    val ABSTRACT_COLORS = "[image encoded in base64]" 
} 

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 

我以为我可以存储2147483647 (231 - 1)字符串中的字符。

这是为什么?

我在下面发表了这张图片。
您可以使用this tool生成base64。

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

enter image description here

+0

这看起来像一个编译错误。例如如果编译器由于没有足够的内存分配而失败,那么抛出的异常应该声明这种情况(它不会)。我建议在https://youtrack.jetbrains.com/issues/KT报告问题。你可以在线搜索一种方法来增加kotlin编译器的分配内存或类似的东西。 – mfulton26

回答

4

正如@ mfulton26在加载字符串时,有些事情正在发生与编译器在评论中提及。碰撞错误应该报告给Kotlin issue tracker

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

例如,如果该文件是src/main/resources/abstract-colors.txt你可以read the entire file into a string

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

如果您并不需要它为Base64编码格式,您可以将图像保存为二进制和读入一个ByteArray

val ABSTRACT_COLORS = javaClass.getResourceAsStream("/abstract-colors.jpg") 
           .use { it.readBytes() } 
+1

字符串小于0.5MB而不是0.5GB;)我知道我可以从文件中加载内容......但仍然可以在编译时使用它。 – mklimek

+0

@mklimek啊,我在脑海里加了一个'K'。 –

+0

@mklimek编辑并离开答案(未来的其他人可能需要这项工作,答案也是针对社区的) –