2016-09-19 8 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がフリーズします。
コンパイルするために軽いエディタを使って編集してください。 @ mfulton26文字列をロードするときに何かがコンパイラで起こっていることによって、コメントで述べたように

enter image description here

+0

これはコンパイルのバグのようです。例えばコンパイラーに十分なメモリーが割り当てられていないために失敗した場合、スローされた例外はそのように述べるべきです(そうではありません)。 https://youtrack.jetbrains.com/issues/KTで問題を報告することをお勧めします。オンラインでkotlinコンパイラが割り当てたメモリなどを増やす方法を探しているかもしれません。 – mfulton26

答えて

4

。クラッシュバグはKotlin issue trackerに報告する必要があります。

回避策として、src/main/resourcesディレクトリにファイルとして追加し、文字列をStringまたはByteArrayとして動的に読み込むことができます。例えば

、ファイルはあなたがsrc/main/resources/abstract-colors.txtread 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.5GB未満で0.5GBではありません;)私はファイルからコンテンツを読み込むことができると知っています...しかし、それでもコンパイル時にそれを持っていると良いでしょう。 – mklimek

+0

@mklimekああ、私は私の心の中で最後に 'K'を追加しました。 –

+0

@mklimekが編集して回答を残しています(将来的には他の人がこの回避策を必要とするかもしれません。答えはコミュニティのためです) –

関連する問題