将String的字节复制到所选字符集

时间:2016-08-10 11:51:41

标签: java arrays string character-encoding java-8

在Java 1.8.0中,我希望将String的字节复制到给定数组,而不返回新数组。我发现了三种接近我想要的方法:

  1. byte[] String.getBytes(String charsetName)给出了我想要的结果,但它会返回一个新数组。

  2. void String.getBytes(int srcBegin, int srcEnd, byte dst[], int dstBegin)复制到给定数组,但它没有选择字符集的选项,删除了char中每个char[] String.value的高8位。这种方法也恰好被弃用了。

  3. byte[] StringCoding.encode(Charset cs, char[] ca, int off, int len),由上面的String.getBytes调用,也可以完成这项工作,但它会返回一个新数组。这种方法也不会公开使用。

  4. 我的用例是迭代字符串集合,将字节读取到现有结构中,而不关心每个字符串都有唯一的字节数组。在开头一次性分配对象是可以的,但我不想在迭代字符串时分配对象。

    有没有人可以建议如何在没有分配新数组或任何其他对象的情况下获得第二种方法的功能?

1 个答案:

答案 0 :(得分:2)

您可以将数组包装在ByteBuffer中,并直接使用CharsetEncoder:

byte[] byteArray = ...;
String charsetName = ...;

ByteBuffer buffer =
    ByteBuffer.wrap(byteArray, dstBegin, dstEnd - dstBegin);
CharsetEncoder encoder = Charset.forName(charsetName).newEncoder();
CoderResult result =
    encoder.encode(CharBuffer.wrap(string), buffer, true);
if (!result.isUnderflow()) {
    result.throwException();
}

请注意ByteBuffer.wrap是轻量级的,不会创建新数组;它只提供一个ByteBuffer实例,该实例将其存储委托给赋予该方法的字节数组。

如果您打算使用整个字节数组,则可以使用更易于阅读的ByteBuffer.wrap(byteArray)