我有一个非常大的数组[Byte],我想扫描特定的字符。我们假设编码是UTF-8。我基本上想要查找特定的Chars,并将数组的切片转换为(子)字符串以解析单个JSON对象。我宁愿不从Array [Byte]产生一个巨大的字符串。我希望在数组中找到很多小的JSON对象。并非所有对象都具有相同的键/值对。我只对一些有关键/值感兴趣的对象感兴趣。我知道如何将Array [Byte]转换为String,我只是不知道如何逐步或零碎地进行。
答案 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),则可以创建较少的通用代码。
仅供参考,因为你提到使用非常相似的代码来流式传输评论,我created和Enumeratee[[Array[Byte], Array[Char]]
用于Play框架,它将非阻塞字节流逐步转换为非阻塞字符流。