2016-09-19 42 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編輯並離開答案(未來的其他人可能需要這項工作,答案也是針對社區的) –