Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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
Java 无法处理大于65535个字符的字符串文字。编译器抛出IllegalArgumentException_Java_Scala_Jvm_Base64_String Literals - Fatal编程技术网

Java 无法处理大于65535个字符的字符串文字。编译器抛出IllegalArgumentException

Java 无法处理大于65535个字符的字符串文字。编译器抛出IllegalArgumentException,java,scala,jvm,base64,string-literals,Java,Scala,Jvm,Base64,String Literals,我正在尝试在Scala中解码Base64编码的图像。字符串文字长度超过65535个字符。每当我试图编译下面的代码时,编译器都会给出一个IllegalArgumentException Scala代码: val data = "/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAA ... " val imageByte = Base64.getDecoder.decode(data) val byteArray = new ByteArrayInputStream(

我正在尝试在Scala中解码Base64编码的图像。字符串文字长度超过65535个字符。每当我试图编译下面的代码时,编译器都会给出一个IllegalArgumentException

Scala代码:

val data = "/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAA ... "
val imageByte = Base64.getDecoder.decode(data)        
val byteArray = new ByteArrayInputStream(imageByte)       
val image = ImageIO.read(byteArray)                       
ImageIO.write(image, "jpeg", new File("image.jpeg"))
编译器异常:

Error:scalac: Error:         org.jetbrains.jps.incremental.scala.remote.ServerException
java.lang.IllegalArgumentException
at scala.tools.asm.ByteVector.putUTF8(ByteVector.java:213)
at scala.tools.asm.ClassWriter.newUTF8(ClassWriter.java:1092)
at scala.tools.asm.ClassWriter.newString(ClassWriter.java:1525)
at scala.tools.asm.ClassWriter.newConstItem(ClassWriter.java:1042)
at scala.tools.asm.MethodWriter.visitLdcInsn(MethodWriter.java:1134)
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genConstant(GenASM.scala:1582)
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.scala$tools$nsc$backend$jvm$GenASM$JPlainBuilder$$genInstr$1(GenASM.scala:2296)
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder$$anonfun$genBlock$1$2.apply(GenASM.scala:2227)
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder$$anonfun$genBlock$1$2.apply(GenASM.scala:2213)
at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:186)
at scala.tools.nsc.backend.icode.BasicBlocks$BasicBlock.foreach(BasicBlocks.scala:195)
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genBlock$1(GenASM.scala:2213)
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genBlocks$1(GenASM.scala:2151)
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genCode(GenASM.scala:2746)
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genMethod(GenASM.scala:1471)
at scala.tools.nsc.backend.jvm.GenASM$JPlainBuilder.genClass(GenASM.scala:1341)
at scala.tools.nsc.backend.jvm.GenASM$AsmPhase.emitFor$1(GenASM.scala:198)
at scala.tools.nsc.backend.jvm.GenASM$AsmPhase.run(GenASM.scala:204)
at scala.tools.nsc.Global$Run.compileUnitsInternal(Global.scala:1501)
at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1486)
at scala.tools.nsc.Global$Run.compileSources(Global.scala:1481)
at scala.tools.nsc.Global$Run.compile(Global.scala:1582)
at xsbt.CachedCompiler0.run(CompilerInterface.scala:115)
at xsbt.CachedCompiler0.run(CompilerInterface.scala:94)
at xsbt.CompilerInterface.run(CompilerInterface.scala:22)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sbt.compiler.AnalyzingCompiler.call(AnalyzingCompiler.scala:101)
at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:47)
at sbt.compiler.AnalyzingCompiler.compile(AnalyzingCompiler.scala:41)
at org.jetbrains.jps.incremental.scala.local.IdeaIncrementalCompiler.compile(IdeaIncrementalCompiler.scala:29)
at org.jetbrains.jps.incremental.scala.local.LocalServer.compile(LocalServer.scala:26)
at org.jetbrains.jps.incremental.scala.remote.Main$.make(Main.scala:67)
at org.jetbrains.jps.incremental.scala.remote.Main$.nailMain(Main.scala:24)
at org.jetbrains.jps.incremental.scala.remote.Main.nailMain(Main.scala)
at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.martiansoftware.nailgun.NGSession.run(NGSession.java:319)

根据这一点,我知道根据JVM规范,字节长度大于2字节的字段是不合适的。在彻底搜索之后,我无法找到解决此问题的方法,因为bug仍然处于活动状态。在Java/Scala中,处理长字符串文本的最佳解决方法是什么。

如果您一次可以读取四个字节,那么一旦解码,这将恰好对应于三个字节。将它们连接在一起,您将得到相同的结果。

当文本如此长时,由于可读性问题,它实际上不应该再嵌入代码中。我会从文件/资源加载它

JAVA 这样做很容易:

String str = IOUtils.toString(this.getClass().getResource("myResource", StandardCharsets.UTF_8);
我认为可读性稍差,但如果您确实不想使用任何库,也可以从Java 7开始:

String str = new String(Files.readAllBytes(Paths.get("myResource")), StandardCharsets.UTF_8);
斯卡拉 在scala中,您可以使用内置的
scala.io.Source
类:

val testTxtSource = Source.fromFile("myResource")
val str = testTxtSource.mkString()
testTxtSource.close()

如果Java 1.7有
文件
类:
字符串s=新字符串(Files.readAllBytes(path.get(“myResource”)、Charset.defaultCharset()),为什么要使用Commons IO@matoni谢谢!我也添加了您的方法。我还要提到
scala.io.Source
,但是需要正确使用几行代码(处理错误和释放资源)。你可以在这里读到更多:@stefanobaghino我也加了这个,谢谢!如果有任何问题,请随意编辑,我不是Scala程序员。为什么需要字符串文字?您不能从文件中读取吗?我正在应用程序服务器中作为请求处理字符串输入。