如何扫描单个Chars的巨大Scala数组[Byte]的部分内容?

时间:2016-01-15 19:28:09

标签: scala

我有一个非常大的数组[Byte],我想扫描特定的字符。我们假设编码是UTF-8。我基本上想要查找特定的Chars,并将数组的切片转换为(子)字符串以解析单个JSON对象。我宁愿不从Array [Byte]产生一个巨大的字符串。我希望在数组中找到很多小的JSON对象。并非所有对象都具有相同的键/值对。我只对一些有关键/值感兴趣的对象感兴趣。我知道如何将Array [Byte]转换为String,我只是不知道如何逐步或零碎地进行。

1 个答案:

答案 0 :(得分:2)

您正在寻找CharsetDecoder

import java.nio.{ByteBuffer, CharBuffer}
import java.nio.charset.StandardCharsets

val bytes: Array[Byte] = ...

val charset = StandardCharserts.UTF_8
val decoder = charset.newDecoder

// decode 1KB
val byteBuffer = ByteBuffer.wrap(bytes, 0, 1024)
val charBuffer = CharBuffer.allocate((int)(charset.averageCharsPerByte * 1024 + 1))
decoder.decode(byteBuffer, charBuffer, false)

// the first byteBuffer.position() bytes have been decoded
// as charBuffer.position() characters, which can be converted to
// a String via charBuffer.toString()

存在错误条件等等,但无论如何,这应该为您提供逐步解码的开始。

请注意,这是一种适用于Java识别的任何编码的通用算法。如果您假设特定编码(UTF-8,UTF-16),则可以创建较少的通用代码。

仅供参考,因为你提到使用非常相似的代码来流式传输评论,我createdEnumeratee[[Array[Byte], Array[Char]]用于Play框架,它将非阻塞字节流逐步转换为非阻塞字符流。