如何在Scala中有效地将IndexedSeq [Byte]转换为utf-8字符串

时间:2016-11-12 02:20:16

标签: scala

我无法将索引的字节序列转换为以utf-8编码的字符串。

scala> val x : IndexedSeq[Byte] = IndexedSeq(64.toByte, 64.toByte, 64.toByte)
scala> x.mkString
res2: String = 748464

现在我可以通过转换为数组,然后像这样构建一个新的String来使它工作;

scala> new String(x.toArray)
res3: String = JT@

但两次分配和复制似乎有点矫枉过正。

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

您想要使用指定Charset的构造函数。

但即使从StringBuilder,你也无法避免复制到String的基础值。

另一个想法可能是反序列化,但你仍然需要缓冲和额外的处理来按摩字节。

为了好玩:

scala> val x : IndexedSeq[Byte] = IndexedSeq(65.toByte, 65.toByte, 65.toByte)
x: IndexedSeq[Byte] = Vector(65, 65, 65)

scala> import collection.generic.CanBuildFrom
import collection.generic.CanBuildFrom

scala> val cbf = new CanBuildFrom[IndexedSeq[Byte], Char, String] {
     | def apply(from: IndexedSeq[Byte]) = apply()
     | def apply() = StringBuilder.newBuilder
     | }
cbf: scala.collection.generic.CanBuildFrom[IndexedSeq[Byte],Char,String]{def apply(from: IndexedSeq[Byte]): StringBuilder; def apply(): StringBuilder} = $anon$1@4f820f42

scala> x.map(_.toChar)(cbf)
res0: String = AAA